Visual C++ 2010:对MSVC运行时部署的更改(不再使用清单的SxS)

Gov*_*ert 27 winsxs c++-cli visual-studio-2010 msvcr100.dll

在哪里可以找到一些官方说明,kb文章或其他描述Visual Studio 2010 C/C++运行时链接和部署策略更改的文档?

在Visual Studio 2008(使用VC90运行时)下,清单嵌入在本机映像中,运行时库部署为并行程序集(WinSxS).使用VS 2008 SP1重建本机exe或库时,这会导致问题,因为嵌入式清单需要更新版本的C++运行时.

对于VS 2010和MSVCR100运行时版本,策略似乎已完全更改.

  1. 文件msvcr100.dll和其他C/C++运行时库不再作为SxS程序集安装.
  2. 在VS2010下进行编译时,嵌入式清单中不会添加运行时"依赖"条目,这意味着可能会在运行时加载任何版本的msvcr100.dll.
  3. 在安装了.NET 4的计算机上,匹配的运行时名为msvcr100_clr0400.dll,并且不会被本机代码加载,但重命名为msvcr100.dll的副本可以正常工作.我认为这意味着任何使用C/C++代码的进程总是会加载两个版本的相同C/C++运行时.

这似乎是政策的一个重大变化,从SxS部署的回溯和我们在VS 2008下的清单依赖性.任何人都可以更好地了解变化的内容,并且可能指向一些文档,描述这些变化的自述文件或博客文章,动机和相关影响?

它认为这种方式更好 - 强大的版本清单和SxS部署是一场噩梦 - 但我对VS 2010中这些意外且看似无证的变化感到惊讶.

额外问题:如何在VS 2010下编译我的C++/CLI库以链接到msvcr100_clr0400.dll而不是msvcr100.dll?这个想法是C++/CLI程序集应该运行时没有.NET 4安装的依赖项(没有静态链接).

Han*_*ant 16

你已经回答了大部分问题,CRT的并排部署是一场噩梦,让太多的程序员陷入困境.微软同意并放弃了VS2010的发布.它返回到c:\ windows\system32中的DLL,名为msvcr100.dll.和msvcp100.dll,vcomp100.dll,atl100.dll,mfc100.dll,mfcm100.dll,其他运行时支持DLL.VS2003和早期版本的方式.现在,解决DLL Hell问题再次成为用户的负担.最不可能这样做的人但他们确实倾向于有预算来支付支出.与需要从免费网站获得帮助的程序员不同:)

但是您可以提供帮助,现在再次启用应用程序本地部署,您可以将msvcr100.dll部署在与主EXE相同的目录中.在以前的版本中明确检查和禁止.应用程序本地有一些细节,它隔离了你的应用程序的良好意味但不幸的更新.虽然您现在自己负责部署更新以修复安全漏洞.如果这不舒服,那么部署并依赖系统目录中的副本.

千万不能尝试链接到msvr100_clr0400.dll,这是一个私人副本由CLR使用.就像msvcr.dll是Microsoft DLL使用的私有副本一样.您没有链接到这些DLL所需的.lib文件.

  • 抱歉 - .NET 2.0框架确保安装了MSVCR80.dll,.NET 3.5确保安装了MSVCR90.dll.有趣的是,没有合理的方法来处理Windows上的标准C/C++运行时库.对于.NET团队来说,安装"官方"运行时可再发行组件已不再适用,而且需要私有地为我的应用程序提供私有版本.我认为SxS有一些道理......至少它试图真正解决版本化共享库的问题. (3认同)
  • 不,无法保证已安装mscrt90.dll.不是安装.NET,不安装Windows.如果您从未制作过使用c:\​​ program files\common files\merge modules中的合并模块或运行vcredist_x86.exe的安装程序,那么您有很多运气或精明的客户.现在使用应用程序本地部署更少需要,xcopy可以完成这项工作.我想是PDC谈话.有一阵子了. (2认同)
  • 我完全放弃了动态链接到MSVC运行时.对于C/C++中的小型库或应用程序,我认为静态链接没有合理的替代方法.相比之下,小型.NET应用程序和库非常棒,因为底层基础架构是负责任的打包和服务. (2认同)