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

c#从64位进程调用LoadLibrary加载64位库失败,c#,pinvoke,loadlibrary,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我调用加载库(dll\u C\u路径)到一个64位的库

我在尝试使用LoadLibrary的p/Invoke调用加载库时,计算机上出现问题

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadLibrary(string dllToLoad);
这是我的配置。调用程序集(A)在x64中编译,它调用另一个编译为AnyCPU的程序集(B)。从B我调用
加载库(dll\u C\u路径)
到一个64位的库C。所有这些都可以在我运行Win10 64位的计算机上运行,但在另一台运行Win7 64位的计算机上失败,并出现以下错误(在调用
GetLastError
之后):%1不是有效的Win32应用程序

B上,在调用
LoadLibrary
之前,我已经验证了
Environment.Is64BitProcess=true
。我用DependencyWalker打开了库C,它显示为64位。但对我来说最奇怪的是,在一台机器上工作,而在另一台机器上却不工作。原因可能是什么

编辑

我正在将完整的绝对路径传递到
LoadLibrary
。下面是Dependency Walker(libraryC是aec.dll)的简图。我不习惯,但我注意到,aec.dll所依赖的msvcr120.dll没有64位的图标。这能给我们一些提示吗


有两种可能的解释:

  • 您的代码发现32位DLL或其他无效映像。我们不知道您是依赖DLL搜索路径还是指定绝对路径
  • 您的代码找到一个64位DLL,但当它解析其依赖项时,会发现一个32位或其他无效模块
    您应该进行一些调试以找出问题所在。我会编写一个简单的C++程序来加载库,避免P/Unk的额外复杂性。我会在配置文件模式下使用依赖项查看器来确定哪个依赖项无效

    是否可能找到了同名的32位版本的C?我正在从临时文件夹中的资源中提取lib C,并且我已经检查了路径。很明显,您复制了错误版本的msvcr120.dll。如果已安装VS2013,则您的计算机上有两个,一个在c:\windows\system32中,另一个在c:\windows\syswow64中。您需要第一个,64位版本。不是打字错误,64位版本在system32中,32位版本在syswow64中。Wow64是32位进程运行的仿真器。@HansPassant这台电脑不是我的,是客户的。他告诉我不要在程序和功能下安装VS2013。他只有VC++Redist。2013年(x64)。此外,通过搜索dll,他在system32下看到一个msvcr120.dll和一个msvcr120_clr0400.dll,而在syswow64上,只有一个msvcr120_clr0400.dll。我该如何解决这个问题?一般来说,我应该如何在用户机器上处理这些问题?好吧,不让客户来处理是一个明智的选择。首先自己测试部署,确保包含所有正确的依赖项,这样客户所要做的就是复制目录。谢谢您的建议。我在我的帖子中添加了更多细节(参见编辑)。在我看来,你的案例2可能是原因。如果是,我能做什么?确保正确安装所需的依赖项是的,Hans Passant也提出了同样的建议,但我不确定我该怎么做…请查看我的问题的评论我不知道你的依赖项是什么以及你希望如何满足它们,分发它们等等。我真的不想在对一个更一般的问题的回答的评论中讨论你的细节。好的,标记为回答,因为我问的是原因,你知道了。我仍然有这个问题,但我会提出另一个问题