【问题标题】:c# calling LoadLibrary from a 64-bit process to load a 64-bit library failsc#从64位进程调用LoadLibrary加载64位库失败
【发布时间】: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


【解决方案1】:

有两种可能的解释:

  1. 您的代码找到了 32 位 DLL 或其他无效图像。我们不知道您是依赖 DLL 搜索路径还是指定绝对路径。
  2. 您的代码找到了一个 64 位 DLL,但是当它解析其依赖项时,发现了一个 32 位或其他无效模块。

您应该进行一些调试以找出问题所在。我会编写一个简单的 C++ 程序来加载库并避免 p/invoke 的额外复杂性。我会在配置文件模式下使用 Dependency Viewer 来确定哪个依赖项无效。

【讨论】:

  • 感谢您的建议。我在我的帖子中添加了更多细节(见编辑)。在我看来,您的案例 2 可能是原因。如果是,我该怎么办?
  • 确保正确安装所需的依赖项
  • 是的,Hans Passant 也提出了同样的建议,但我不确定我应该怎么做...请检查我的问题的 cmets
  • 我不知道您的依赖项是什么,以及您希望如何满足它们、分发它们等。我真的不想在 cmets 中详细说明您对更一般性的答案问题。
  • 好的,标记为回复,因为我在问原因,你明白了。我的问题仍然存在,但我会为它打开另一个问题
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2012-05-11
  • 2012-04-20
  • 2010-09-12
  • 2023-03-07
  • 2011-08-12
相关资源
最近更新 更多