我需要接管其他人的C#代码,但我之前从未使用过C#,并且对Visual Studio缺乏经验。代码无法加载某些DLL。它看起来像这样;
hModule = LoadLibrary("XXX.dll");
if (hModule == IntPtr.Zero)
{
MessageBox.Show("Load failed.", "Error");
return;
}
导致DLL无法加载的可能原因是什么?如果是路径问题,我将DLL放在与可执行文件相同的位置。我是否需要为此dll手动添加一些引用(使用Visual Studio 2012)?或者dll有问题吗?如果是这样,如何验证?
我知道这个问题不适合Stack Overflow,因为它太开放了。但提出的一些可能性可以指出我正确的方向。我想在Stackoverflow成员关闭此问题之前要求一些余地,或者将其投票太多次。谢谢。
编辑:在尝试了Hans Passant的答案后,我收到了错误%1 is not a valid Win32 application
。这是否意味着DLL有问题?相同的DLL可以使用Visual C ++代码库,但不能使用C#代码。我还注意到代码中有一些静态库.lib。但是如果我没有错,C#不会接受静态库。
答案 0 :(得分:2)
pinvoke代码中经常缺少正确的错误检查和报告。你必须自己处理它,你不再拥有友好的.NET例外,以免让你摆脱困境。起点是使pinvoke声明正确:
[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)]
static extern IntPtr LoadLibrary(string lpFileName);
使用SetLastError属性对于获取pinvoke marshaller以获取Windows错误代码至关重要。然后报告它,以便很清楚为什么无法加载DLL:
IntPtr hModule = LoadLibrary(path);
if (hModule == IntPtr.Zero) throw new System.ComponentModel.Win32Exception();
到目前为止,“找不到文件”是最常见的事故。不仅适用于该DLL,也适用于任何依赖DLL。您只能通过启用加载程序快照或使用SysInternals的Process Monitor实用程序轻松查看。
答案 1 :(得分:1)
这是来自doc:
如果字符串指定了完整路径,则该函数仅搜索该路径 模块的路径。如果字符串指定相对路径或a 模块名称没有路径,该函数使用标准搜索 寻找模块的策略;有关更多信息,请参阅备注。如果 功能找不到模块,功能失败。什么时候 指定路径,请务必使用反斜杠(),而不是正斜杠 (/)。有关路径的详细信息,请参阅命名文件或目录。
另见: 返回值
如果函数成功,则返回值是模块的句柄。 如果函数失败,则返回值为NULL。要获得扩展错误 信息,请致电
GetLastError
。
更多信息: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx