尝试加载带有对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位的图标。这可以提供一些暗示吗?
答案 0 :(得分:1)
有两种可能的解释:
你应该做一些调试来找出问题所在。我会编写一个简单的C ++程序来加载库并避免p / invoke的额外复杂性。我在配置文件模式下使用Dependency Viewer来确定哪个依赖项无效。