由于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++ ?

由于dll依赖其他sjs - dll, pinvoke失败

如果有人搜索这个问题:当然,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,忘记我最后的评论,它已经解决了我的问题。