如何确保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,那么您的程序将无法运行。我想这样做的用途是通过友好的错误消息快速且可预测地失败,而不是稍后失败。
我有一段 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,那么您的程序将无法运行。我想这样做的用途是通过友好的错误消息快速且可预测地失败,而不是稍后失败。