C# 如何确保dll的存在

C# 如何确保dll的存在,c#,external,dllimport,C#,External,Dllimport,我有一段C代码,它调用非托管dll [DllImport("urlmon.dll", CharSet = CharSet.Ansi)] private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved); 此代码存在于windows窗体控件解决方案中,将在另一个面向大量用户的应用程序中使用 据我所知,DllImport属性在系统上查找d

我有一段C代码,它调用非托管dll

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);
此代码存在于windows窗体控件解决方案中,将在另一个面向大量用户的应用程序中使用

据我所知,
DllImport
属性在系统上查找dll,如果找到了,将
extern
函数与之配对(我主要知道
extern
在C中的工作原理)

如何确保在用户系统中找到此dll?是否应将其与应用程序捆绑(我知道如何做到这一点)?它是否确定会存在,因为它包含在Windows*中



*我见过许多应用程序因为Windows XP和更旧版本中缺少DLL而崩溃,因此我不太相信这种说法。

我认为确保DLL存在的主要责任方不是你的应用程序,而是你的安装程序!在应用程序运行时,担心依赖性已经太迟了。但是,如果您想在安装程序出错时更“优雅地”失败,以下内容可能会很有用


您要检查的实际上是呼叫是否会成功。您可以简单地尝试在try-catch块中调用导入的函数,并查看调用是否成功。如果未找到DLL,将抛出
DllNotFoundException
,如果找到DLL但没有该函数,则将抛出
EntryPointNotFoundException
,如下所示:

当然,只有当DLL有一个函数允许您使用测试参数调用它时,这才有效;在URLMon的情况下,一个合适的函数应该是
UrlMkGetSessionOption
,如示例所示。如果它没有这个功能,但是您知道它第一次被调用的时间,那么您可以在测试中包装第一次调用


但是,另一方面,如果DLL不存在,您的程序可以合理地做什么?如果它是使用该功能的可选功能,则可以禁用它,但通常如果DLL不存在/不起作用,则程序无法运行。我想这样做的目的是通过友好的错误消息快速、可预测地失败,而不是在以后失败。

您检查过这个问题吗?可接受的答案包括可用于检查用户计算机上是否存在DLL的代码。这是从XP开始的特定情况。除非您希望在早就不受支持的Windows版本上运行代码,否则此特定函数将始终存在(单独检查它不会增加任何内容)。一般问题更复杂。谢谢,这正是我想要的。我打算使用clickonce,因此我无法控制安装程序对系统的要求,但我可以进行配置。
bool available = true;
try {
    UrlMkGetSessionOption(...test parameters...);
}
catch (DllNotFoundException)
{
    available = false;
}
catch (EntryPointNotFoundException)
{
    available = false;
}