由于dll依赖其他sjs - dll, pinvoke失败
本文关键字:dll pinvoke 失败 sjs 依赖 其他 由于 | 更新日期: 2023-09-27 18:13:49
问题简而言之:如何从DLL调用函数使用p/调用时,a.l ll依赖于另一个SXS-lib(在我的情况下MSVCR90.DLL)?
我想在DLL中使用pinvoke调用一个函数。Pinvoke本身可以很好地用于其他库。从非托管c++调用DLL中的函数也可以正常工作。
问题是DLL有一个对MSVCR90.DLL的引用,它驻留在一些SXS文件夹中。
在c++中使用LoadLibrary,库可以像前面提到的那样使用。使用c#时,我不知道如何加载库。我总是得到一个错误,MSVCR90.DLL丢失在计算机上。
加载库是这样的:
[DllImport("C:''work''dllhell''sample''sample.dll",
EntryPoint = "sample", CallingConvention = CallingConvention.Cdecl)]
public static extern int sample();
当调用函数sample
时,我只得到以下错误:HRESULT: 0x8007007E,表示没有找到库。实际上,该库在SXS目录中以不同的版本存在。
我尝试使用Dependency Walker (depends),但它也无法找到正确的库版本,到目前为止。
库还附带了一个清单,其中包含以下条目:
清单中包含以下语句:
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
processorArchi tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
请求的版本存在于我的机器上,我使用的是vs2010,它提供了该库的新版本,但我想这应该不是问题。
我发现很多线程讨论类似的问题。我知道,我有依赖问题,但我找不到解决办法。我知道我缺失的依赖,我有一个清单,但这应该为c#做吗?不仅适用于非托管c++ ?
如果有人搜索这个问题:当然,David Heffernan已经解决了这个问题,依赖项必须添加到应用程序的清单中,即文件app.manifest,如果没有这样的文件,那么在您的项目中将其创建为新的清单。
以下条目就足够了:
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
该条目直接进入XML文件中的根节点程序集。
感谢David Heffernan,忘记我最后的评论,它已经解决了我的问题。