【发布时间】:2016-04-01 18:56:34
【问题描述】:
我在尝试通过对 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 位的图标。这能给点提示吗?
【问题讨论】:
-
是否有可能找到同名的 32 位版本的 C?
-
我正在从临时文件夹中的资源中提取 lib C,并且我已经检查了路径。
-
很明显,您复制了错误版本的 msvcr120.dll。如果您安装了 VS2013,那么您的机器上有两个,一个在 c:\windows\system32,另一个在 c:\windows\syswow64。您需要第一个,即 64 位版本。不是错字,64位版本在system32,32位版本在syswow64。 Wow64 是运行 32 位进程的模拟器。
-
@HansPassant PC 不是我的,它来自客户。他告诉我没有在程序和功能下安装VS2013。他只有 VC++ Redist。 2013 (x64)。此外,通过搜索 dll,在 system32 下他看到一个 msvcr120.dll 和一个 msvcr120_clr0400.dll,而在 syswow64 上,只有一个 msvcr120_clr0400.dll我>。我该如何解决这个问题?一般来说,我应该如何在用户机器上处理此类问题?
-
好吧,不把它留给客户将是一个明智的选择。首先自己测试部署,确保包含所有正确的依赖项,这样客户所要做的就是复制目录。
标签: c# pinvoke loadlibrary