由于DLL依赖于其他SXS-DLL,pinvoke失败

时间:2011-11-07 16:38:24

标签: c# .net pinvoke dll sxs

问题简单:当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 ++?

1 个答案:

答案 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,忘了我上次的评论,这是我问题的解决方案。