Wo kann ich einen offiziellen Hinweis, einen KB-Artikel oder eine andere Dokumentation finden, in der die Änderungen an der Visual Studio 2010 C/C++-Laufzeitverknüpfung und -bereitstellungsrichtlinie beschrieben werden?
Unter Visual Studio 2008 (mit der VC90-Laufzeitumgebung) wurde ein Manifest in native Bilder eingebettet, und die Laufzeitbibliotheken wurden als Side-by-Side-Assemblies (WinSxS) bereitgestellt. Dies führte zu Problemen bei der Wiederherstellung einer nativen Exe oder Bibliothek mit VS 2008 SP1, da eine aktualisierte Version der C++-Laufzeitumgebung durch das eingebettete Manifest erforderlich war.
Für VS 2010 und die MSVCR100-Laufzeitversion scheint sich die Richtlinie vollständig geändert zu haben.
- Die Datei msvcr100.dll und die anderen C/C++-Laufzeitbibliotheken werden nicht mehr als SxS-Assemblies installiert.
- Beim Kompilieren unter VS2010 wird dem eingebetteten Manifest kein Laufzeitabhängigkeitseintrag hinzugefügt, was bedeutet, dass jede Version von msvcr100.dll zur Laufzeit geladen werden kann.
- Auf Rechnern, auf denen .NET 4 installiert ist, heißt die entsprechende Runtime msvcr100_clr0400.dll und wird von nativem Code nicht geladen, obwohl eine in msvcr100.dll umbenannte Kopie problemlos funktioniert. Ich denke, das bedeutet, dass jeder Prozess mit C/C++-Code immer zwei Versionen derselben C/C++-Laufzeitumgebung geladen hat.
Dies scheint eine bedeutende Änderung der Strategie zu sein, die von der SxS-Bereitstellung und den Manifestabhängigkeiten, die wir unter VS 2008 hatten, abweicht. Könnte jemand mehr Licht auf die Änderungen werfen und vielleicht auf eine Dokumentation, ein Readme oder einen Blogbeitrag verweisen, der diese Änderungen, die Motivation und die damit verbundenen Auswirkungen beschreibt?
Ich denke, es ist besser so - die starke Version manifestieren und SxS Bereitstellung war ein Alptraum - aber ich bin überrascht über diese unerwarteten und scheinbar undokumentierten Änderungen in VS 2010.
Bonusfrage: Wie kann ich meine C++/CLI-Bibliothek unter VS 2010 kompilieren, um mit msvcr100_clr0400.dll anstelle von msvcr100.dll zu verknüpfen? Die Idee ist, dass die C++/CLI-Assembly ohne andere Abhängigkeiten als die von .NET 4 installierten (ohne statisches Linking) ausgeführt werden sollte.