我有一个使用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
没有帮助。我仍然得到同样的错误。我没有看到任何其他在线建议,而不是上面列出的建议。 任何人都可以帮助我吗?
答案 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
,那么看起来它不是发布版本。请您的同事检查构建配置。
要使用调试版,您可以尝试以下操作:
c:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\
(这适用于Visual Studio 2008,x86,根据您的系统调整路径)。Microsoft.VC90.DebugCRT
和Microsoft.VC90.DebugMFC
目录复制到包含可执行文件的目录。<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.30729.6161" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
,根据您的dll需要更改9.0.30729.6161
。所需的程序集版本可以在sxstrace的输出中找到,也可以在*.intermediate.manifest
文件中与其构建目录中的dll一起找到。抱歉,我没有Visual Studio 2005,也无法提供确切的数字。