C#中此DLL加载错误的可能原因是什么?

时间:2014-07-29 10:51:48

标签: c# visual-studio dll

我需要接管其他人的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#不会接受静态库。

2 个答案:

答案 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