【问题标题】:WinSxS fails to load VC++ DLLsWinSxS 无法加载 VC++ DLL
【发布时间】: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


【解决方案1】:

好的,现在可以了 - 感谢您的帮助。

我想出了两个必须解决的问题:

1) 我必须安装“Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC 安全更新”,它部署了版本 8.0.50727.6195 的 VC++ 程序集。此更新在 Microsoft 服务器上很难找到,因此链接如下:http://www.microsoft.com/download/en/details.aspx?id=26347 通常你只能找到 8.0.50727.762 版本(“Visual C++ 2005 Service Pack 1 Redistributable Package),它已经过时了。由于 C++ DLL 是针对 6195 编译的,安装更新解决了第一个问题。

2) 虽然 C++/CLI DLL 是在发布模式下编译的,但下面的本机 C++ DLL 是在调试模式下交付的。现在,Microsoft 许可协议禁止部署 VC++ 调试 DLL,并且 VC++ Redist 包不包含 VC++ 调试 DLL。 http://msdn.microsoft.com/en-us/library/aa985618.aspx 说:

应用程序的调试版本不可再分发,各种 Visual C++ 动态链接库 (DLL) 的调试版本均不可再分发。

解决方案:原生 C++ DLL 的开发者给了我一个发布版本,一切正常...

【讨论】:

  • 后代注意事项:步骤 1)解决了我的“应用程序无法启动,因为它的并排配置不正确”与原始问题无关的错误。当其他建议失败时,也可能对其他人有用。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2017-06-26
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多