简而言之:当 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++?