问题简单:当A.dll依赖于另一个SXS-lib(在我的情况下是MSVCR90.DLL)时,如何使用p / invoke从DLL A.dll调用函数?
我想使用pinvoke调用DLL中的函数。 pinvoke本身适用于其他libs。从非托管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(依赖)但到目前为止它还无法找到正确版本的库。
该库附带了一个清单,其中包含以下条目:
清单中包含以下声明:
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
processorArchi tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
我的机器上存在请求的版本,我正在使用VS 2010,它提供了该库的较新版本,但这不应该是一个问题,我猜。
我发现很多线程都在讨论类似的问题。我知道,我有一个依赖问题,但我无法找到解决方案。我知道我缺少依赖,我有一个清单,但是应该为C#做吗?不仅适用于非托管C ++?
答案 0 :(得分:2)
如果有人搜索该问题:当然,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,忘了我上次的评论,这是我问题的解决方案。