WinSxS无法加载VC++ DLLs

10

我的.NET/C#项目需要使用一些VC++的DLL,其中一个是C++/CLI DLL,我用它作为.NET项目的公共接口。其他的DLL是用原生C++编写的。我没有访问这些VC++ DLL的源代码,只能使用它们。

我创建了一个.NET测试项目并引用了C++/CLI DLL。编译器很开心,没有问题。只有一个问题:当我启动.NET程序的EXE文件时,由于缺少VC++核心DLLs,我会收到关于C++ DLLs的错误信息。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软件包。我知道winsxs中有一个用于Microsoft.VC80.CRT的策略文件,将该程序集的所有版本都重定向到当前版本8.0.50727.762(这是此问题的解决方案)。 但正如上面的错误所述,这个策略文件似乎没有起作用或没有被考虑。系统只是想找到程序集的8.0.50727.6195版本。

那么这就是第一个问题:问题在哪里?解决了这个问题后,我可以解决最初的问题......


版本不匹配在信息中非常明显。它需要8.0.50727.6195,而你的是8.0.50727.762。请前往search.microsoft.com并在搜索框中输入“8.0.50727.6195”。 - Hans Passant
问题是是否可能“说服”应用程序接受762而不是6195。 - Dialecticus
我对微软在这种情况下的版本控制不确定。我在微软下载中没有找到版本号为8.0.50727.6195的VC++ 2005 Redist包,当前的VC++ 2005 Redist包的版本号为8.0.50727.762。如果762是比6195更高的版本,则应该按照我所写的方式:WinSxS策略文件应将6195重定向到762-但它没有这样做。 - Matthias
也许我还是个傻瓜。通过另一篇文章,我找到了“Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update” - 即版本6195的链接。现在我遇到的问题是,一些交付的C ++ DLL是在Debug模式下编译的,并且依赖于Debug VC ++ DLL。我正在请求其他开发人员给我Release版本,希望这样能够解决问题。我会为您更新情况。谢谢! - Matthias
1个回答

9

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

我找到了两个必须解决的问题:

1)我必须安装“Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update”,该更新部署了VC++程序集的8.0.50727.6195版本。这个更新很难在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是以Release模式编译的,但下面的本机C++ DLL是以Debug模式交付的。现在,Microsoft许可协议禁止部署VC ++ Debug DLL,并且VC ++ Redist包不包括VC ++ Debug DLL。http://msdn.microsoft.com/en-us/library/aa985618.aspx说:

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

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


未来的世代请注意:步骤1)解决了我的与原问题无关的“该应用程序无法启动,因为它的配对配置不正确”错误。当其他建议失效时,这个方法可能也适用于其他人。 - shinjin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接