如何确保dll的存在

How to ensure the presence of a dll

我有一段 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 存在的主要责任方不是您的应用程序,而是您的 安装程序 !在您的应用程序运行时,担心依赖性已经太晚了。但是,如果您想在安装程序出现问题时失败更多 'elegantly',以下内容可能会有用。


你要检查的实际上是调用是否成功。您可以简单地尝试在 try-catch 块中调用导入的函数,看看调用是否成功。如果未找到 DLL,则抛出 DllNotFoundException,如果找到 DLL 但没有该功能,则抛出 EntryPointNotFoundException,根据 How do I handle a failed DllImport? 上的答案:

bool available = true;
try {
    UrlMkGetSessionOption(...test parameters...);
}
catch (DllNotFoundException)
{
    available = false;
}
catch (EntryPointNotFoundException)
{
    available = false;
}

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

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