c# 从 64 位进程调用 LoadLibrary 以加载 64 位库失败
c# calling LoadLibrary from a 64-bit process to load a 64-bit library fails
我在尝试通过 P/Invoke 调用 LoadLibrary 加载库时遇到机器问题。
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadLibrary(string dllToLoad);
这是我的配置。调用程序集 (A) 在 x64 中编译,它调用另一个编译为 AnyCPU 的程序集 (B)。从 B 我调用 LoadLibrary(dll_C_Path)
到一个 64 位的库 C。所有这些在我的机器 运行 Win10 64 位上运行,但在另一台机器 运行 Win7 64 位上失败,出现以下错误(调用 GetLastError
后): “%1 不是有效的 Win32 应用程序”。
在 B 上,在调用 LoadLibrary
之前,我已验证 Environment.Is64BitProcess=true
。我用 DependencyWalker 打开了库 C,它显示为 64 位。但对我来说最奇怪的是,在一台机器上可以工作,而在另一台机器上却不能。可能是什么原因?
编辑
我正在将完整的绝对路径传递给 LoadLibrary
。下面是 Depency Walker 的屏幕截图(库 C 是 aec.dll)。我不习惯,但我注意到一件事是 aec.dll 所依赖的 msvcr120.dll 没有 64 位的图标。这能给点提示吗?
有两种可能的解释:
- 您的代码找到了 32 位 DLL,或其他无效图像。我们不知道您是依赖 DLL 搜索路径还是指定绝对路径。
- 您的代码找到了一个 64 位 DLL,但是当它解析其依赖项时,发现了一个 32 位或其他无效模块。
您应该进行一些调试以找出问题所在。我会编写一个简单的 C++ 程序来加载库并避免 p/invoke 的额外复杂性。我会在配置文件模式下使用 Dependency Viewer 来确定哪个依赖项无效。
我在尝试通过 P/Invoke 调用 LoadLibrary 加载库时遇到机器问题。
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadLibrary(string dllToLoad);
这是我的配置。调用程序集 (A) 在 x64 中编译,它调用另一个编译为 AnyCPU 的程序集 (B)。从 B 我调用 LoadLibrary(dll_C_Path)
到一个 64 位的库 C。所有这些在我的机器 运行 Win10 64 位上运行,但在另一台机器 运行 Win7 64 位上失败,出现以下错误(调用 GetLastError
后): “%1 不是有效的 Win32 应用程序”。
在 B 上,在调用 LoadLibrary
之前,我已验证 Environment.Is64BitProcess=true
。我用 DependencyWalker 打开了库 C,它显示为 64 位。但对我来说最奇怪的是,在一台机器上可以工作,而在另一台机器上却不能。可能是什么原因?
编辑
我正在将完整的绝对路径传递给 LoadLibrary
。下面是 Depency Walker 的屏幕截图(库 C 是 aec.dll)。我不习惯,但我注意到一件事是 aec.dll 所依赖的 msvcr120.dll 没有 64 位的图标。这能给点提示吗?
有两种可能的解释:
- 您的代码找到了 32 位 DLL,或其他无效图像。我们不知道您是依赖 DLL 搜索路径还是指定绝对路径。
- 您的代码找到了一个 64 位 DLL,但是当它解析其依赖项时,发现了一个 32 位或其他无效模块。
您应该进行一些调试以找出问题所在。我会编写一个简单的 C++ 程序来加载库并避免 p/invoke 的额外复杂性。我会在配置文件模式下使用 Dependency Viewer 来确定哪个依赖项无效。