【发布时间】:2012-02-24 23:32:26
【问题描述】:
我遇到了几个 VC++ DLL 的问题,我应该将它们包含在我的 .NET/C# 项目中。一个 VC++ DLL 是一个 C++/CLI DLL,我将其用作 .NET 项目的公共接口。其他 DLL 是用本机 C++ 编写的。我无法访问 VC++ DLL 的源代码,我只能使用它们。
我制作了一个 .NET 测试项目并引用了 C++/CLI DLL。没问题,编译器很幸运,很棒。只有一个问题:当我启动 .NET 程序的 EXE 时,由于缺少 VC++ 核心 DLL,我收到有关 C++ DLL 的错误。 sxstrace 显示以下内容(缩短):
INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
INFO: Reference: Microsoft.VC80.OpenMP,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
...
ERROR: Cannot resolve reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195".
现在我不傻,尝试了几件事。我已经阅读了很多关于 WinSxS 的内容,以便更深入地了解正在发生的事情。 现在我已经到了让我感到奇怪的地步。我要执行程序的系统安装了当前版本 8.0.50727.762 (SP1) 中的 VC++ Redistributable 包。我知道 winxs 中有一个 Microsoft.VC80.CRT 的策略文件,该文件将这个程序集的所有版本重定向到当前版本 8.0.50727.762(这是http://blogs.msdn.com/b/nikolad/archive/2007/03/29/a-solution-to-two-references-to-different-versions-of-crt-mfc-atl-in-one-application-manifest-file.aspx 问题的解决方案)。 但正如上面的错误所说,这个策略文件似乎不起作用或没有被考虑在内。系统只想找到8.0.50727.6195版本的程序集。
现在这是第一个问题:这里有什么问题?想通了之后,我就可以解决最初的问题了……
【问题讨论】:
-
版本不匹配在消息中一目了然。它想要 8.0.50727.6195,你得到 8.0.50727.762。转到 search.microsoft.com 并在搜索框中输入“8.0.50727.6195”。
-
问题是是否可以“说服”应用程序接受 762 而不是 6195。
-
我不确定微软在这种情况下的版本控制。我在 Microsoft 下载中没有找到版本 8.0.50727.6195 的 VC++ 2005 Redist 包,当前的 VC++ 2005 Redist 包的版本为 8.0.50727.762。如果 762 的版本高于 6195,它应该是我写的:WinSxS 策略文件应该将 6195 重定向到 762 - 但它没有。
-
好吧,也许我还是个傻瓜。在另一篇文章中,我找到了“Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update”的链接——也就是 6195 版。现在我发现一些交付的 C++ DLL 已在调试模式下编译并依赖于调试VC++ DLL。我要求其他开发人员给我发布版本,我希望这会奏效。我会告诉你这方面的最新情况。谢谢!
标签: c++ .net visual-c++ dependencies winsxs