首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pinvoke失败,因为DLL依赖于其他SXS-DLL

pinvoke失败,因为DLL依赖于其他SXS-DLL
EN

Stack Overflow用户
提问于 2011-11-08 00:38:24
回答 1查看 917关注 0票数 3

问题简而言之:当A.dll依赖于另一个SXS-lib (在我的例子中是MSVCR90.DLL)时,如何使用p/invoke从DLL调用函数?

我想使用pinvoke在DLL中调用一个函数。pinvoke本身可以很好地用于其他库。从非托管C++调用DLL中的函数也可以很好地工作。

问题是DLL引用了驻留在某些SXS文件夹中的MSVCR90.DLL。

在C++中使用LoadLibrary,可以如上所述地使用该库。使用C#时,我不知道如何加载库。我总是收到计算机上缺少MSVCR90.DLL的错误消息。

这是加载库的样子:

代码语言:javascript
复制
[DllImport("C:\\work\\dllhell\\sample\\sample.dll", 
    EntryPoint = "sample", CallingConvention = CallingConvention.Cdecl)]
public static extern int sample();

当调用函数sample时,我只得到以下错误: HRESULT: 0x8007007E,表示不会找到该库。实际上,该库存在于SXS目录中的不同版本中。

我尝试使用Dependency Walker (Dependency),但到目前为止,它也无法找到正确的库版本。

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

清单中包含以下语句:

代码语言:javascript
复制
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
    processorArchi    tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

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

我发现有很多讨论类似问题的帖子。我知道,我有依赖问题,但我找不到解决方案。我知道我丢失的依赖项,我有一个清单,但这是否也适用于C#?不仅适用于非托管C++?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-02 00:57:58

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

以下条目就足够了:

代码语言:javascript
复制
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>

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

感谢David Heffernan.忘记我的上一条评论,它已经解决了我的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8039586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档