c#从64位进程调用LoadLibrary来加载64位库失败

时间:2016-04-01 18:56:34

标签: c# pinvoke loadlibrary

尝试加载带有对LoadLibrary的P / Invoke调用的库时,我在计算机上遇到问题。

[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位的图标。这可以提供一些暗示吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

有两种可能的解释:

  1. 您的代码找到32位DLL或其他无效图像。我们不知道您是依赖DLL搜索路径还是指定绝对路径。
  2. 您的代码找到64位DLL,但在解析其依赖项时,会找到32位或其他无效模块。
  3. 你应该做一些调试来找出问题所在。我会编写一个简单的C ++程序来加载库并避免p / invoke的额外复杂性。我在配置文件模式下使用Dependency Viewer来确定哪个依赖项无效。