【问题标题】:C# Dll Import failure: "The application has failed to start because its side-by-side configuration is incorrect"C# Dll 导入失败:“应用程序无法启动,因为它的并排配置不正确”
【发布时间】:2012-09-09 09:18:30
【问题描述】:

我有一个 c# .net 4 应用程序,使用 vs 2010。 我正在尝试导入一个 c++ dll(基于 vs 2005)。

 [DllImport("Card.dll")]

我失败了:

无法加载 DLL 'Card.dll':应用程序无法启动,因为它的并行配置不正确。请查看应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详细信息。 (HRESULT 异常:0x800736B1)

使用 sxstrace.exe 我得到:

错误:无法解析引用 Microsoft.VC80.DebugMFC,processorArchitecture="x86"

我还发现:

MFC80D.DLL 和 MSVCR80D.DLL 丢失

注意这不是 DebugCRT,因为这个问题是由使用 Debug 编译的 DLL 而不是 Release 引起的。我现在用的是Release编译的dll,问题是DebugMFC。

我已经尝试了任何我可以在网上找到的东西。为了节省时间我会介绍我尝试过的,所以我不会再收到这个建议了:

1- 我已经安装了 Microsoft Visual C++ 2010 Redistributable Package + SP1 + 安全更新

2- 我已经安装了 Microsoft Visual C++ 2008 Redistributable Package

3 - 我已经安装了 Microsoft Visual C++ 2005 Redistributable Package

4 - 我尝试将这个应用程序作为“发布”而不是“调试”运行

5 - 我尝试将 entryPoint 设置为 DllImport

没有帮助。我仍然得到同样的错误。我没有在网上看到任何其他建议,而不是上面列出的建议。 谁能帮帮我?

【问题讨论】:

  • 引用:Please see the application event log。它说什么?
  • 错误:无法解析引用 Microsoft.VC80.DebugCRT,processorArchitecture="x86"
  • 构建您的 C++ DLL 的发布版本,而不是调试版本。
  • 我的同事给了我一个新编译的 dll。她说这次是释放。我犯了同样的错误。她是不是做错了什么,这是一个调试版本,还是有其他可能的解释?
  • 我没有收到 CRT 消息。我没有注意到。现在是:“无法解析引用 Microsoft.VC80.DebugMFC”

标签: c# c++ visual-studio-2010 dll dllimport


【解决方案1】:

因为它说“无法解析引用 Microsoft.VC80.DebugCRT,processorArchitecture="x86",这意味着您缺少对 VC 8.0 的调试 crt 运行时的依赖。这意味着您需要构建一个版本,而不是调试, card.dll 的版本。Microsoft 不提供用于调试 CRT 运行时的可再发行包。这些仅随 Visual Studio 提供。因此构建 card.dll 的发布版本,这应该有助于您的情况。

【讨论】:

  • 我做到了,我知道得到:“无法解析引用 Microsoft.VC80.DebugMFC”
  • 我不确定 express 2005 是否带有 MFC。你必须找出答案。顺便说一句,你有没有使用依赖遍历器来查看是什么注入了对 MFC 的依赖?
【解决方案2】:

您是否可以控制构建Card.dll?如果是,请查看它是如何构建的。它必须使用正确版本的 VC++(随 VS 2005 提供的版本)并启用清单。然后,安装 2005 Redist。包必须解决问题。如果您无法自行构建Card.dll,则必须分析嵌入式清单(如果有)并联系作者以合作解决问题。

【讨论】:

    【解决方案3】:

    默认情况下静态库链接到动态运行时。

    如果您在 VS2005 中重新构建 dll,请更改您的 配置属性 | C/C++ |代码生成 |运行时库设置为静态运行时以避免该问题。

    【讨论】:

    • 我有 C# 2010 express。你能告诉我怎么做吗?
    • 我更新了我不清楚的答案。如果您可以更改项目属性,它在 vs2005 方面。
    【解决方案4】:

    您可以使用Dependency Walker 来尝试找出您的 dll 提取的依赖项。如果它说它想要*d.dll,那么看起来它不是一个发布版本。请您的同事检查构建配置。

    要使用调试版本,您可以尝试以下操作:

    1. 转到c:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\(这是针对Visual Studio 2008, x86,根据您的系统调整路径)。
    2. Microsoft.VC90.DebugCRTMicrosoft.VC90.DebugMFC 目录复制到您的可执行文件所在的目录。
    3. 在复制的目录中调整清单文件中的程序集版本(声明如下:<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.30729.6161" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>,根据您的dll需要更改9.0.30729.6161
    4. 尝试运行应用程序。

    可以在 sxstrace 的输出中或在其构建目录中的 dll 旁边的 *.intermediate.manifest 文件中找到所需的程序集版本。抱歉,我没有 Visual Studio 2005,无法给出确切的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2010-11-02
      • 2011-05-23
      • 1970-01-01
      • 2015-02-08
      • 2021-12-22
      • 2015-08-17
      相关资源
      最近更新 更多