Co robi „useLegacyV2RuntimeActivationPolicy” w konfiguracji .NET 4?

214

Podczas konwersji projektu, który używał SlimDX, a zatem ma niezarządzany kod, do .NET 4.0 napotkałem następujący błąd:

Zespół trybu mieszanego jest budowany w oparciu o wersję „v2.0.50727” środowiska wykonawczego i nie można go załadować do środowiska wykonawczego 4.0 bez dodatkowych informacji konfiguracyjnych.

Googling dał mi rozwiązanie, które polega na dodaniu tego do konfiguracji aplikacji:

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

Moje pytanie brzmi: co się useLegacyV2RuntimeActivationPolicydzieje? Nie mogę znaleźć żadnej dokumentacji na ten temat.

Cameron MacFarland
źródło

Odpowiedzi:

165

Po pewnym czasie (i dalszych poszukiwaniach) znalazłem ten wpis na blogu autorstwa Jomo Fishera.

Jednym z ostatnich problemów, które widzieliśmy, jest to, że ze względu na obsługę równoległych środowisk uruchomieniowych .NET 4.0 zmienił sposób, w jaki wiąże się ze starszymi zestawami trybu mieszanego. Te zespoły to na przykład te, które zostały skompilowane z C ++ \ CLI. Obecnie dostępne zestawy DirectX są w trybie mieszanym. Jeśli zobaczysz taki komunikat, oznacza to, że napotkałeś problem:

Zestaw trybu mieszanego jest wbudowany w wersję środowiska wykonawczego „v1.1.4322” i nie można go załadować do środowiska wykonawczego 4.0 bez dodatkowych informacji konfiguracyjnych.

[Fantastyczna okazja]

Dobrą wiadomością dla aplikacji jest to, że masz możliwość powrotu do wiązania ery .NET 2.0 dla tych zestawów poprzez ustawienie flagi app.config w następujący sposób:

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

Wygląda na to, że zmienił się sposób, w jaki środowisko wykonawcze ładuje zestawy trybu mieszanego. Nie mogę znaleźć żadnych szczegółów na temat tej zmiany ani powodów jej wprowadzenia. Ale useLegacyV2RuntimeActivationPolicyatrybut wraca do ładowania CLR 2.0.

Cameron MacFarland
źródło
28
Warto zauważyć, że tymczasem odpowiedź marklios ( stackoverflow.com/questions/1604663/... ) zawiera link do jego dokładnego wyjaśnienia na temat tej zmiany.
Steffen Opel
1
Dokładne wyjaśnienie tego można znaleźć na MSDN (chociaż nie wspomina wprost o wyżej wspomnianym rozwiązaniu): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
Co jeśli dodam to zarówno do konfiguracji dla mojej aplikacji, jak i konfiguracji dla mojego projektu UnitTest i nadal otrzymuję błąd ładowania pliku podczas uruchamiania testów. Czy powinienem opublikować nowe pytanie?
CodenameCain
126

Oto wyjaśnienie, które napisałem niedawno, aby pomóc w pozbawieniu informacji na temat tego atrybutu. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (łącze do internetowego archiwum Wayback Machine)

Aby zacytować najbardziej odpowiednie bity:

[Instalowanie .NET] v4 jest „bez wpływu”. Nie powinien zmieniać zachowania istniejących komponentów po ich zainstalowaniu.

Atrybut useLegacyV2RuntimeActivationPolicy pozwala zasadniczo powiedzieć: „Mam pewne zależności od starszych interfejsów API shim. Spraw, by działały tak, jak kiedyś, w odniesieniu do wybranego środowiska wykonawczego. ”

Dlaczego nie robimy tego domyślnym zachowaniem? Możesz argumentować, że to zachowanie jest bardziej kompatybilne i znacznie ułatwia przenoszenie kodu z poprzednich wersji. Jeśli sobie przypomnisz, nie może to być zachowanie domyślne, ponieważ spowodowałoby to wpływ instalacji v4, co mogłoby zepsuć istniejące aplikacje zainstalowane na twoim komputerze.

Pełny post wyjaśnia to bardziej szczegółowo. W RTM dokumenty MSDN na ten temat powinny być lepsze.

Mark Miller
źródło
user20493, czy możesz uruchomić swoją aplikację ze zmienną środowiskową COMPlus_CLRLoadLogDir ustawioną na pusty katalog, do którego aplikacja ma dostęp do zapisu i współdzielenie wynikowych dzienników (przed udostępnieniem przeszukaj dane PII). Może to pomóc wyjaśnić, co się dzieje. Atrybut config może nie zostać zastosowany w kontekście, w którym działa Twoja aplikacja.
Mark Miller,
Ten link powinien również pomóc Ci zrozumieć, na czym polega problem i jakie rozwiązanie dla Ciebie robi: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane