6

我有 ac# .net 4 app ,使用 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

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

4

4 回答 4

5

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

于 2012-09-09T11:01:00.100 回答
3

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

于 2012-09-09T10:45:26.183 回答
3

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

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

于 2012-09-12T19:06:27.307 回答
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>9.0.30729.6161根据您的dll需要更改。
  4. 尝试运行应用程序。

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

于 2012-09-18T08:46:59.103 回答