Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
CLI/C++;DLL包装非托管DLL,在.NET中运行时崩溃(缺少ieshims.DLL和gpsvc.DLL)_.net_C++ Cli_Wrapper_X86 64 - Fatal编程技术网

CLI/C++;DLL包装非托管DLL,在.NET中运行时崩溃(缺少ieshims.DLL和gpsvc.DLL)

CLI/C++;DLL包装非托管DLL,在.NET中运行时崩溃(缺少ieshims.DLL和gpsvc.DLL),.net,c++-cli,wrapper,x86-64,.net,C++ Cli,Wrapper,X86 64,我继承了一个未更改的DLL(最初由C代码构建),并希望在.NET项目中使用它。我有一个头文件,它将DLL的功能包在C++类型的对象中,这是我想公开的面向对象的功能。当我把这些头文件包含在标准C++(Win32)项目中,并在C++ + CLI项目中引用原始DLL。 使用Visual C++ Express 2010,我尝试为.NET构建一个管理DLL。由于依赖关系问题,此DLL随后在运行时崩溃。沃克说: 警告:未找到至少一个延迟加载依赖项模块 警告:由于延迟负载相关模块中缺少导出功能,至少有一个模

我继承了一个未更改的DLL(最初由C代码构建),并希望在.NET项目中使用它。我有一个头文件,它将DLL的功能包在C++类型的对象中,这是我想公开的面向对象的功能。当我把这些头文件包含在标准C++(Win32)项目中,并在C++ + CLI项目中引用原始DLL。

使用Visual C++ Express 2010,我尝试为.NET构建一个管理DLL。由于依赖关系问题,此DLL随后在运行时崩溃。沃克说:

警告:未找到至少一个延迟加载依赖项模块

警告:由于延迟负载相关模块中缺少导出功能,至少有一个模块具有未解析的导入

并抱怨找不到gpsvc.dll或ieshims.dll。我知道这与x86 vx64(我在x64上运行Wi7)有关,但是,因为我可以在C++项目中使用我的系统DLL,所以我怀疑必须在一个托管的DLL中包装这个,以便在同一个系统上使用.NET。 提前非常感谢任何能够提供任何见解的人


(顺便说一句,我的目标是开发一个.NET程序集,而不是直接在原始DLL上使用p/invoke,因为在我之后,许多具有有限互操作经验的C#/VB程序员都会使用它)

解决方案:x86/x64问题是一个令人费解的问题。我有一个三dll长的依赖链。Visual Studio对所有引用的“copy local”属性设置为true,因此我引用的托管dll是本地复制的,远离其依赖项

由于某些原因,我无法理解,将引用的copy-local属性设置为false并删除它制作的本地副本并不能解决问题。我不得不将依赖项复制到C#project的本地bin中


一个潜在的好处是,过分关注dependency walker中缺少的呼叫时间依赖可能会将您引向错误的方向。

正如您Rory在回答中提到的那样,解决方案似乎是,您需要在C#应用程序的“引用”部分包含所有依赖的DLL/手动将所有DLL包含在C#bin或运行.exe的同一文件夹中

我刚刚遇到了与您的设置类似的问题。我有以下依赖项:

<> >代码> C应用> >(1)CLI包装器DLL>(2)C++包装器DLL>(3)第三方DLL< /Calp>

在参考资料部分,我包括了(1)CLI DLL。我没有包含(2)C++ DLL,因为它抛出了错误<代码>错误……无法添加。请确保文件是可访问的,并且它是有效的程序集或COM组件< /C>(解释:C++ DLL不是.NET/CLR兼容)。

<强>我简单地假设,因为(1)CLI DLL正确地和成功地链接到(2)C++DLL<强>(我用C++ + CLI控制台应用程序测试),<强> C++应用程序能够通过引用(1)CLI依赖性访问(2)C++依赖性。这是不正确的。

我不知道原因,但C#应用程序无法访问CLI的依赖项


<>强> >我的解决方案是手动地在.exe目录中包含(2)C++ dll。< /强>记住,(1)CLI DLL在C应用程序中被设置为true,如果<代码>本地副本< /C>被设置为true。我似乎没有遇到(2)C++ DLL引用(3)第三方DLL(即(3)第三方DLL可以驻留在指定路径中/不需要本地复制)的问题。

关于“平台目标”的.NET项目的设置是什么?请参见C#项目设置中的“构建”选项卡。如果C++的DLL构建为32位,并且在64位平台上执行,则“平台目标”需要“x86”。不过,我怀疑这与您正在观察的问题无关。平台目标-x86、允许不安全代码未选中,优化代码已选中。谢谢确保您使用的是32位版本的Dependency Walker。该工具不够智能,无法在看到32位可执行文件时使用32位库搜索规则。感谢您的建议。我最初使用的是32位依赖项walker。我的困惑主要是因为我能够在C++项目中使用这个非托管DLL,但是当我试图用C++或CLI把它包在.NET中时,它就有了所有这些依赖性错误。即使我在32位Win7上构建和运行所有内容时也会发生这种情况,因为Overflow不是论坛。也就是说,在这些情况下(当作者回答自己的问题时),建议的行动方针是发布对您的问题的答案,接受该答案,然后编辑标题以删除“已解决”和问题以删除解决方案(现在是答案)。谢谢