Was macht 'useLegacyV2RuntimeActivationPolicy' in der .NET 4-Konfiguration?

214

Beim Konvertieren eines Projekts, das SlimDX verwendet und daher nicht verwalteten Code enthält, nach .NET 4.0 ist der folgende Fehler aufgetreten:

Die Assembly im gemischten Modus basiert auf der Version 'v2.0.50727' der Laufzeit und kann ohne zusätzliche Konfigurationsinformationen nicht in die 4.0-Laufzeit geladen werden.

Durch das Googeln habe ich die Lösung gefunden, die darin besteht, diese zur Anwendungskonfiguration hinzuzufügen:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Meine Frage ist, was macht das useLegacyV2RuntimeActivationPolicy? Ich kann keine Dokumentation darüber finden.

Cameron MacFarland
quelle

Antworten:

165

Nach einiger Zeit (und mehr Suche) fand ich diesen Blogeintrag von Jomo Fisher.

Eines der jüngsten Probleme, das wir gesehen haben, ist, dass .NET 4.0 aufgrund der Unterstützung von Side-by-Side-Laufzeiten die Art und Weise geändert hat, wie es an ältere Assemblys im gemischten Modus gebunden wird. Diese Assemblys sind beispielsweise solche, die aus C ++ \ CLI kompiliert wurden. Derzeit verfügbare DirectX-Assemblys sind im gemischten Modus. Wenn Sie eine Meldung wie diese sehen, wissen Sie, dass Sie auf das Problem gestoßen sind:

Die Assembly im gemischten Modus basiert auf der Version 'v1.1.4322' der Laufzeit und kann ohne zusätzliche Konfigurationsinformationen nicht in die 4.0-Laufzeit geladen werden.

[Snip]

Die gute Nachricht für Anwendungen ist, dass Sie die Möglichkeit haben, für diese Assemblys auf die Bindung der .NET 2.0-Ära zurückzugreifen, indem Sie ein app.config-Flag wie folgt setzen:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>

Es sieht also so aus, als ob sich die Art und Weise, wie die Laufzeit Assemblys im gemischten Modus lädt, geändert hat. Ich kann keine Details zu dieser Änderung finden oder warum sie durchgeführt wurde. Das useLegacyV2RuntimeActivationPolicyAttribut kehrt jedoch zum Laden von CLR 2.0 zurück.

Cameron MacFarland
quelle
28
Es ist erwähnenswert, dass die Antwort von marklios ( stackoverflow.com/questions/1604663/… ) einen Link zu seiner ausführlichen Erklärung zu dieser Änderung enthält.
Steffen Opel
1
Eine ausführliche Erklärung hierzu finden Sie auf MSDN (obwohl die oben erwähnte Lösung nicht ausdrücklich erwähnt wird): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
Was ist, wenn ich dies sowohl zur Konfiguration für meine Anwendung als auch zur Konfiguration für mein UnitTest-Projekt hinzugefügt habe und beim Ausführen von Tests immer noch ein Fehler beim Laden der Datei angezeigt wird? Soll ich eine neue Frage stellen?
CodenameCain
126

Hier ist eine Erklärung, die ich kürzlich geschrieben habe, um zu helfen, dass keine Informationen zu diesem Attribut vorliegen. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (Link zur Internet Archive Wayback Machine)

Um die relevantesten Bits zu zitieren:

[Installieren von .NET] v4 ist "nicht wirkungsvoll". Das Verhalten vorhandener Komponenten bei der Installation sollte nicht geändert werden.

Mit dem Attribut useLegacyV2RuntimeActivationPolicy können Sie im Grunde sagen: „Ich habe einige Abhängigkeiten von den älteren Shim-APIs. Bitte lassen Sie sie in Bezug auf die gewählte Laufzeit so arbeiten, wie sie es früher getan haben. “

Warum machen wir dies nicht zum Standardverhalten? Sie könnten argumentieren, dass dieses Verhalten kompatibler ist und das Portieren von Code aus früheren Versionen erheblich vereinfacht. Wenn Sie sich erinnern, kann dies nicht das Standardverhalten sein, da dies die Installation von Version 4 beeinträchtigen würde, wodurch vorhandene auf Ihrem Computer installierte Apps beschädigt werden könnten.

Der vollständige Beitrag erklärt dies ausführlicher. Bei RTM sollten die MSDN-Dokumente dazu besser sein.

Mark Miller
quelle
user20493, können Sie Ihre App mit der Umgebungsvariablen COMPlus_CLRLoadLogDir ausführen, die auf ein leeres Verzeichnis festgelegt ist, auf das die App Schreibzugriff hat, und die resultierenden Protokolle freigeben (bitte vor der Freigabe nach PII durchsuchen). Es kann helfen zu erklären, was passiert. Das Konfigurationsattribut wird möglicherweise nicht auf den Kontext angewendet, in dem Ihre App ausgeführt wird.
Mark Miller
Dieser Link soll Ihnen auch helfen zu verstehen, was das Problem ist und was die Lösung für Sie tut: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane