Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在某些机器上使用P/Invoke调用dll时LoadLibrary会失败? 我有一个.NET应用程序,它使用P/Unjk调用C++ API。C++ DLL具有来自第三方DLL的依赖关系。第三方dll调用LoadLibrary动态加载libeay32.dll,这是一个OpenSSL依赖项_C#_C++_Dll_Pinvoke - Fatal编程技术网

C# 为什么在某些机器上使用P/Invoke调用dll时LoadLibrary会失败? 我有一个.NET应用程序,它使用P/Unjk调用C++ API。C++ DLL具有来自第三方DLL的依赖关系。第三方dll调用LoadLibrary动态加载libeay32.dll,这是一个OpenSSL依赖项

C# 为什么在某些机器上使用P/Invoke调用dll时LoadLibrary会失败? 我有一个.NET应用程序,它使用P/Unjk调用C++ API。C++ DLL具有来自第三方DLL的依赖关系。第三方dll调用LoadLibrary动态加载libeay32.dll,这是一个OpenSSL依赖项,c#,c++,dll,pinvoke,C#,C++,Dll,Pinvoke,在做了几次测试之后,我发现.NET应用程序在Windows 10中工作正常,但在使用Windows 7的某些部署中失败。失败的原因是.NET进程未加载libeay32.dll。我尝试将libeay32.dll放在与进程相同的目录和系统文件夹中(记住动态加载搜索顺序),但失败仅在Windows 7 32位中持续存在。此外,如果我从一个C++控制台应用程序调用API DLL,它在所有平台上都没有问题。为了解决这个问题,我在.NET应用程序中调用了代码> LoadLibrary ,然后对C++ API

在做了几次测试之后,我发现.NET应用程序在Windows 10中工作正常,但在使用Windows 7的某些部署中失败。失败的原因是.NET进程未加载libeay32.dll。我尝试将libeay32.dll放在与进程相同的目录和系统文件夹中(记住动态加载搜索顺序),但失败仅在Windows 7 32位中持续存在。此外,如果我从一个C++控制台应用程序调用API DLL,它在所有平台上都没有问题。为了解决这个问题,我在.NET应用程序中调用了代码> LoadLibrary <代码>,然后对C++ API进行P/INVICK调用,并在所有目标平台(Windows 10/7 32和64位)中工作。 <>为什么<代码> LoadLibrary >代码>在Windows 7中加载LyBay32.dll失败,而如果调用API的C++ DLL依赖调用称为使用P/INKEKE?

,则不加载Windows 10? 编辑 评论中的一些注释:

  • 所有编译的程序集都是针对x86体系结构的
  • 在发布问题之前,我验证了没有依赖项文件 在缺少的地方,使用依赖项walker

  • 可能是因为dll依赖于某些丢失的文件。使用并查看它需要什么文件。检查两个系统。该工具将以红色显示丢失的文件。不要盲目复制文件。查看它们是什么,部署它们需要什么运行时或安装程序,并正确部署它们。

    .Net应用程序可以以任意CPU作为目标构建,并以64位和32位模式运行,但如果您为目标选择任意CPU,操作系统将根据其首选项选择一个。如果您具有本机依赖项,这意味着无法加载您所依赖的库,因为您运行的位不正确。如果您可以将应用程序约束到您期望的比特性,那么它可能会更好。

    实际上,这可能更实际。我使用了依赖项walker,并且没有在依赖链中任何一个dll发生故障的平台中丢失的文件。然后按照步骤并确定原因。谢谢建议。奇怪的是,在测试过程中,所有程序集都是针对x86的,唯一失败的平台是32位Windows 7。您以前尝试过使用sysinternals process monitor吗?当应用程序试图打开文件和搜索顺序时,它会告诉你。这可能是因为你的操作系统找不到正确的位置,或者文件没有注册。我以前使用过它,但忘记了它。谢谢你的提醒。我会试试。好吧,当LoadLibrary失败时返回的错误代码是什么?无法获取错误代码,因为LoadLibrary是在第三方dll中调用的,我没有访问源代码的权限。好吧,这就不是问题了。你问的是我们看不到的代码。当DLL从.NET应用程序加载而不是依赖性时,搜索路径是否可能不同?如果你对设置快速DLL测试项目感到满意,我会首先确定我可以在目标平台上在本地C++上下文中加载DARN东西。隐式地通过导入库和显式地通过LoadLibrary。靠近金属,然后再添加托管/本地过渡内容。您也可以在必要时使用迂回截获对LoadLibrary的调用,获取内部错误代码,实际上您甚至不需要走那么远,调试器可以限制这一点