C#Dll导入失败:“应用程序无法启动,因为它的并行配置不正确”

时间:2012-09-09 09:18:30

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

我有一个使用vs 2010的c#.net 4应用程序。 我试图导入一个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

没有帮助。我仍然得到同样的错误。我没有看到任何其他在线建议,而不是上面列出的建议。 任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

您可以使用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. 尝试运行该应用程序。
  5. 所需的程序集版本可以在sxstrace的输出中找到,也可以在*.intermediate.manifest文件中与其构建目录中的dll一起找到。抱歉,我没有Visual Studio 2005,也无法提供确切的数字。