27

在哪里可以找到一些官方说明、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++ 运行时的两个版本。

这似乎是政策上的重大变化,从我们在 VS 2008 下的 SxS 部署和清单依赖项回溯。任何人都可以更清楚地了解发生了什么变化,并可能指向一些文档、描述这些变化的自述文件或博客文章,动机和相关影响?

它认为这样更好——强大的版本清单和 SxS 部署是一场噩梦——但我对 VS 2010 中这些意想不到且看似未记录的变化感到惊讶。

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

4

2 回答 2

16

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

但是您可以提供帮助,应用程序本地部署现在再次启用,您可以将 msvcr100.dll 部署在与主 EXE 相同的目录中。这在以前的版本中被明确检查和禁止。App-local 有一些细微之处,它将您与破坏您的应用程序的善意但不幸的更新隔离开来。尽管您现在自己负责部署修复安全漏洞的更新。如果这不舒服,那么部署并依赖系统目录中的副本。

不要尝试链接到 msvr100_clr0400.dll,这是供 CLR 使用的私有副本。很像 msvcr.dll 是供 Microsoft DLL 使用的私有副本。您没有链接到这些 DLL 所需的 .lib 文件。

于 2011-07-08T12:06:43.407 回答
6

只是关于这个主题的几个链接——我希望有人会发现它们有用:

于 2012-03-02T08:35:41.910 回答