C# DLL 导入失败:"The application has failed to start because its side-by-side configuration is incorrect

C# Dll Import failure: "The application has failed to start because its side-by-side configuration is incorrect"

本文关键字:because start to its side-by-side incorrect is configuration failed has 失败      更新时间:2023-10-16

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

 [DllImport("Card.dll")]

我得到了失败:

无法加载DLL"Card.DLL":由于并行配置不正确,应用程序无法启动。有关详细信息,请参阅应用程序事件日志或使用命令行sxstrace.exe工具。(HRESULT:0x800736B1的异常)

使用sxstrace.exe我得到:

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

我还发现:

MFC80D.DLL和MSVCR80D.DLL缺少

请注意,这不是DebugCRT,因为这个问题是由使用调试编译的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-我试着以"Release"而不是"Debug"的身份运行这个应用程序

5-我试图将entryPoint设置为DllImport

没有帮助。我仍然会犯同样的错误。除了上面列出的建议,我没有在网上看到任何其他建议。有人能帮我吗?

因为上面写着"无法解析引用Microsoft.VC80.DebugCRT,processorArchitecture="x86",这意味着您缺少对VC8.0调试crt运行时的依赖。这意味着你需要构建一个card.dll的发布版本,而不是调试版本。微软没有为调试CRT运行时提供可重新分发的软件包。这些只有视觉工作室提供。因此,构建一个card.dll的发布版本,这应该会对您的情况有所帮助。

您可以控制建筑Card.dll吗?如果是,请看一下它是如何建造的。它必须使用正确版本的VC++(与VS2005一起提供的版本)构建,并启用清单。然后,安装2005 Redist。一揽子计划必须解决这个问题。如果您无法自己构建Card.dll,则必须分析嵌入的清单(如果有的话),并联系作者以合作解决问题。

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

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

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

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

  1. 转到c:Program FilesMicrosoft Visual Studio 9.0VCredistDebug_NonRedistx86(这适用于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. 尝试运行应用程序

所需的程序集版本可以在sxtrace的输出中找到,也可以在其生成目录中的*.intermediate.manifest文件以及dll中找到。抱歉,我没有Visual Studio 2005,无法给出确切的数字。

相关文章: