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

标签 c# .net pinvoke dll sxs

问题简而言之:当 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(取决于),但到目前为止它也无法找到正确版本的库。

还有一个包含以下条目的库附带的 list :

list 中包含以下声明:

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

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

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

最佳答案

如果有人搜索该问题:当然,David Heffernan 已经解决了该问题,必须将依赖项添加到应用程序的 list 中,即文件 app.manifest,如果有,请在您的项目中将其创建为新 list 还没有这样的文件。

以下条目就足够了:

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>

此条目直接转到 XML 文件中的根节点程序集。

感谢 David Heffernan,忘记我最后的评论,它已经解决了我的问题。

关于c# - 由于依赖于其他 SXS-DLL 的 DLL,pinvoke 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8039586/

相关文章:

c# - 异步 Web 服务调用是否始终调用 AsyncCallback?

c# - .NET Core 中的环境变量配置

wpf - 如何从 WPF 应用程序打开 MFC 对话框?

c# - DwmGetWindowAttribute 使用 PInvoke 返回 0

c# - C#中如何发现Mutex被获取?

c# - 使用 Google Chrome 和 HTTPListener 获取 ProtocolViolationException

c# - 垃圾收集器是否隐式使用析构函数方法,开发人员是否使用显式处置对象的处置方法?

c# - 确定应用程序是否被阻止/忙碌?

c# - 我的正则表达式匹配整数有什么问题?

.net - 哪种列表/集合类型最适合在 WCF 数据协定中使用?