问题简而言之:当A.dll依赖于另一个SXS-lib (在我的例子中是MSVCR90.DLL)时,如何使用p/invoke从DLL调用函数?
我想使用pinvoke在DLL中调用一个函数。pinvoke本身可以很好地用于其他库。从非托管C++调用DLL中的函数也可以很好地工作。
问题是DLL引用了驻留在某些SXS文件夹中的MSVCR90.DLL。
在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 (Dependency),但到目前为止,它也无法找到正确的库版本。
库中还附带了一个清单,其中包含以下条目:
清单中包含以下语句:
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
processorArchi tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />请求的版本在我的机器上,我使用的是VS2010,它提供了该库的更新版本,但我想这应该不是问题。
我发现有很多讨论类似问题的帖子。我知道,我有依赖问题,但我找不到解决方案。我知道我丢失的依赖项,我有一个清单,但这是否也适用于C#?不仅适用于非托管C++?
发布于 2012-02-02 00:57:58
如果有人搜索这个问题:当然,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.忘记我的上一条评论,它已经解决了我的问题。
https://stackoverflow.com/questions/8039586
复制相似问题