3

简而言之:当 A.dll 依赖于另一个 SXS-lib(在我的情况下为 MSVCR90.DLL)时,如何使用 p/invoke 从 DLL A.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 (depends),但到目前为止它也无法找到正确版本的库。

该库还附带了一个清单,其中包含以下条目:

清单中包含以下语句:

<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
    processorArchi    tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

请求的版本存在于我的机器上,我使用的是 VS 2010,它提供了该库的较新版本,但我想这应该不是问题。

我发现很多讨论类似问题的线程。我知道,我有一个依赖问题,但我无法找到解决方案。我知道我缺少依赖项,我有一个清单,但 C# 也应该这样做吗?不仅适用于非托管 C++?

4

1 回答 1

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 文件中的根节点程序集。

感谢大卫赫弗南,忘记我的最后评论,它已经解决了我的问题。

于 2012-02-01T16:57:58.227 回答