我有一段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,所以我不太相信这个论点。
答案 0 :(得分:1)
我会说确保DLL存在的主要责任方不是您的应用程序,而是您的安装程序!在您的应用程序运行时,担心依赖项已经太晚了。但是,如果您想在安装程序出现问题时更“优雅”地失败,则以下内容可能会有用。
如果通话成功,您想要检查的是什么。您可以简单地尝试在try-catch块中调用导入的函数,并查看调用是否成功。如果未找到DLL,则抛出DllNotFoundException
,如果找到DLL但没有该函数,则根据How do I handle a failed DllImport?上的答案抛出EntryPointNotFoundException
:
bool available = true;
try {
UrlMkGetSessionOption(...test parameters...);
}
catch (DllNotFoundException)
{
available = false;
}
catch (EntryPointNotFoundException)
{
available = false;
}
当然,这仅在DLL具有允许您使用测试参数调用它的函数时才有效;在URLMon的情况下,一个体面的函数将是UrlMkGetSessionOption
,如示例中所示。如果它没有这个,但你知道它何时被调用,那么你可以在测试中包装第一个调用。
但是,另一方面,如果DLL不存在,你的程序可以合理地做些什么?如果它是使用它的可选功能,您可以禁用它,但通常如果DLL不存在/功能,那么您的程序将无法运行。我想那时使用的方法是快速且可预测地使用友好的错误消息,而不是稍后失败。