2009-10-22 22 views
198

Podczas konwersji projekt, który używany SlimDX, a zatem ma kod niezarządzany, aby .NET 4.0 wpadłem na następujący błąd:Co robi "useLegacyV2RuntimeActivationPolicy" w konfiguracji .NET 4?

Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

Googling wokół dał mi rozwiązanie, które ma dodać to do konfiguracji aplikacji :

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

Moje pytanie brzmi, co robi ? Nie mogę znaleźć żadnej dokumentacji na ten temat.

Odpowiedz

155

Po krótkim czasie (i kolejnych poszukiwaniach) znalazłem this blog entry autorstwa Jomo Fisher.

One of the recent problems we’ve seen is that, because of the support for side-by-side runtimes, .NET 4.0 has changed the way that it binds to older mixed-mode assemblies. These assemblies are, for example, those that are compiled from C++\CLI. Currently available DirectX assemblies are mixed mode. If you see a message like this then you know you have run into the issue:

Mixed mode assembly is built against version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

[Snip]

The good news for applications is that you have the option of falling back to .NET 2.0 era binding for these assemblies by setting an app.config flag like so:

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

Wygląda na to, że zmieniono sposób, w jaki środowisko wykonawcze ładuje zespoły w trybie mieszanym. Nie mogę znaleźć żadnych szczegółów na temat tej zmiany ani dlaczego tak się stało. Ale atrybut powraca do ładowania CLR 2.0.

+26

Warto zauważyć, że w międzyczasie marklios answer (http://stackoverflow.com/questions/1604663/what-does-uselegacyv2runtimeactivationpolicy-do-in-the-net-4-config/2467255#2467255) zawiera link do jego dokładne wyjaśnienie dotyczące tej zmiany. –

+1

Dokładne wyjaśnienie tego można znaleźć na stronie MSDN (chociaż nie wspomina się wyraźnie o wyżej wspomnianym rozwiązaniu): http://msdn.microsoft.com/en-us/magazine/ee819091.aspx –

+0

Co jeśli " Dodałem to zarówno do konfiguracji dla mojej aplikacji, jak i do konfiguracji dla mojego projektu UnitTest i wciąż otrzymuję błąd ładowania pliku podczas uruchamiania testów. Czy powinienem napisać nowe pytanie? – CodenameCain

116

Oto wyjaśnienie, które napisałem niedawno, aby pomóc w usunięciu informacji o tym atrybucie. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (Internet Archive Wayback Link Machine)

Aby przytoczyć najbardziej odpowiednie bity:

[Installing .NET] v4 is “non-impactful”. It should not change the behavior of existing components when installed.

The useLegacyV2RuntimeActivationPolicy attribute basically lets you say, “I have some dependencies on the legacy shim APIs. Please make them work the way they used to with respect to the chosen runtime.”

Why don’t we make this the default behavior? You might argue that this behavior is more compatible, and makes porting code from previous versions much easier. If you’ll recall, this can’t be the default behavior because it would make installation of v4 impactful, which can break existing apps installed on your machine.

cały post wyjaśnia to w sposób bardziej szczegółowy. W RTM dokumentacja MSDN na ten temat powinna być lepsza.

+10

+1 za późną obserwację, twoje wyjaśnienie jest najbardziej pomocne! –

+0

Uzgodnione. Bardzo dobre wyjaśnienie. – Roman

+0

@hvd: O ile rozumiem, że Wayback Machine jest dość niezawodny, czy mógłbyś ulepszyć tę odpowiedź, cytując odpowiednie sekcje z linku bezpośrednio w odpowiedzi? Dzięki za pomoc! – BoltClock