27 Stimmen

Visual C++ 2010: Änderungen an der MSVC-Laufzeitverteilung (kein SxS mehr mit Manifest)

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.

  1. Die Datei msvcr100.dll und die anderen C/C++-Laufzeitbibliotheken werden nicht mehr als SxS-Assemblies installiert.
  2. 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.
  3. 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.

16voto

Hans Passant Punkte 894572

Sie haben Ihre Frage bereits größtenteils beantwortet: Der Einsatz des CRT nebeneinander war ein Alptraum, der viel zu viele Programmierer in Schwierigkeiten brachte. Microsoft stimmte zu und gab es für die VS2010-Version auf. Es ist zurück zu einer DLL in C: \windows\system32 mit dem Namen msvcr100.dll. Und msvcp100.dll, vcomp100.dll, atl100.dll, mfc100.dll, mfcm100.dll, die anderen DLLs zur Laufzeitunterstützung. So war es bei VS2003 und früheren Editionen. Jetzt ist es wieder die Aufgabe des Benutzers, ein DLL-Hell-Problem zu lösen. Die Person, die dazu am wenigsten in der Lage ist, hat aber in der Regel ein Budget, um für den Support zu bezahlen. Im Gegensatz zu Programmierern, die Hilfe von einer kostenlosen Website erhalten müssen :)

Aber Sie können helfen, app-local deployment ist jetzt wieder aktiviert, Sie können msvcr100.dll im selben Verzeichnis wie Ihre Haupt-EXE bereitstellen. Das war in früheren Versionen ausdrücklich geprüft und verboten. App-local hat einige Vorzüge, es isoliert Sie von gut gemeinten, aber unglücklichen Updates, die Ihre Anwendung zerstören. Allerdings sind Sie jetzt selbst dafür verantwortlich, dass Updates eingespielt werden, die eine Sicherheitslücke schließen. Wenn Ihnen das unangenehm ist, dann installieren Sie sie und verlassen Sie sich auf die Kopie im Systemverzeichnis.

Do no versuchen, auf msvr100_clr0400.dll zu linken, das ist eine private Kopie für die Verwendung durch die CLR. Ähnlich wie msvcr.dll eine private Kopie für die Verwendung durch Microsoft DLLs ist. Sie verfügen nicht über die .lib-Datei, die Sie zum Verknüpfen mit diesen DLLs benötigen.

6voto

Shunix Punkte 61

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X