LoadLibrary没有失败的DLL:为什么?

Joh*_*ant 1 c# interop

我确信我遗漏了文档中显而易见的东西.我正在LoadLibrary从C#调用并传入一个不存在的DLL.我IntPtr.Zero正如我所期望的那样回来,但是当我打电话时,Marshal.GetLastWin32Error我总是得到0.

这是样本.

class Program {

    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll")]
    private static extern bool FreeLibrary(IntPtr hModule);

    static void Main(string[] args) {
        IntPtr pDll = LoadLibrary(@"c:\NotThere.dll");
        int err = Marshal.GetLastWin32Error();
        Console.WriteLine(err);
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在将这样的代码添加到一个已经无法加载DLL的程序中.知道为什么我没有收到错误信息吗?

Jus*_*tin 8

您的代码未设置DllImport.SetLastError属性标志,这可能是GetLastWin32Error未返回任何内容的原因:

[DllImport("kernel32.dll", SetLastError=true)]
private static extern IntPtr LoadLibrary(string dllToLoad);
Run Code Online (Sandbox Code Playgroud)

要诊断模块未加载的原因,您应该检查Fusion日志(如果模块是托管程序集)和/或依赖性walker.

请记住,可能由于无法加载依赖模块而导致加载错误(例如,VC9可再发行,VS2008编译器编译的所有C++模块都依赖于此),因此即使模块与架构兼容且位于一个可搜索的目录(例如应用程序或系统目录),模块可能仍然无法加载 - Dependency walker非常擅长突出显示这些类型的问题.


Jus*_*ner 7

要记录错误以便可以读取它们Marshal.GetLastWin32Error(),您需要具有SetLastError=true以下DllImport属性:

[DllImport("kernel32.dll", SetLastError=true)]
private static extern IntPtr LoadLibrary(string dllToLoad);
Run Code Online (Sandbox Code Playgroud)