Jaka „dodatkowa konfiguracja” jest konieczna, aby odwoływać się do zestawu trybu mieszanego .NET 2.0 w projekcie .NET 4.0?

525

Mam projekt, w którym chciałbym korzystać z niektórych funkcji .NET 4.0, ale podstawowym wymaganiem jest to, że mogę korzystać ze środowiska System.Data.SQLite, które jest kompilowane z wersją 2.X. Widzę wzmiankę o tym, że jest to możliwe, takie jak przyjęta tutaj odpowiedź, ale nie wiem, jak to osiągnąć.

Gdy próbuję uruchomić mój projekt 4.0, odnosząc się do zestawu 2.X, otrzymuję:

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.

Jaka „dodatkowa konfiguracja” jest konieczna?

jamone
źródło
3
Zobacz także: stackoverflow.com/questions/1604663/…
Michaił
WAŻNE: Jeśli błąd występuje w kolumnie błędu „Plik” as SGEN, wówczas poprawka musi znajdować się w pliku sgen.exe.configobok sgen.exe. Na przykład dla VS 2015 utwórz C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Źródło: SGEN Tryb mieszany Minimalna zawartość pliku:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Odpowiedzi:

685

Aby użyć zestawu trybu mieszanego CLR 2.0 , musisz zmodyfikować plik App.Config, aby zawierał:

<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

Kluczem jest useLegacyV2RuntimeActivationPolicyflaga. Powoduje to, że CLR używa najnowszej wersji (4.0) do załadowania zestawu trybu mieszanego. Bez tego nie będzie działać.

Zauważ, że ma to znaczenie tylko dla zestawów trybu mieszanego (C ++ / CLI). Można załadować wszystkie zarządzane zestawy CLR 2 bez określania tego w app.config.

Reed Copsey
źródło
@ Reed Wypróbowałem Twoją sugestię, ale wyjątek wciąż się pojawia. Dokładnie sprawdziłem plik app.config, który został skopiowany do mojego folderu EXE i nadal nie działa. Pojawia się podczas korzystania z log4net. Nie mogę znaleźć nic na temat tego błędu re: log4net, z wyjątkiem tutaj: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , ale to niewiele mówi. Masz jakieś pomysły, w jaki sposób mogę uzyskać więcej informacji na temat mojego konkretnego problemu?
Dave
@Dave: Sugeruje to, że możesz po prostu użyć natywnej wersji log4net platformy .NET 4 - wydaje się to najlepszą opcją. Jeśli jest dostępna wersja .NET 4, użyj jej ...
Reed Copsey
@Reed nie istnieje, a ja zinterpretowałem tę odpowiedź, abyś musiał skompilować log4net sam. Chyba mogę to zrobić, ale wolałbym po prostu pobrać ich prekompilowane pliki binarne i odwołać się do nich z mojego projektu. Przyjrzę się temu jeszcze trochę. Ale czy możesz pomyśleć, dlaczego zmiana app.config nie powoduje, że działa? Pomyślałem, że może muszę użyć programname.exe.config, ale próbowałem też i to nie zadziałało. Z mojego ograniczonego doświadczenia wynika, że ​​każda nazwa pliku robi to samo.
Dave
19
Pomogło mi umieszczenie tej linii w pliku konfiguracyjnym NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <obsługiwana wersja uruchomieniowa = "v4.0" /> <wymagana wersja uruchomieniowa = "v4.0.20506" /> </startup>
Filip Zawada
76
Microsoft powinien utworzyć przycisk w oknie dialogowym wyjątku: „Przeszukaj ten komunikat wyjątku przy
przepełnieniu stosu
35

Ten post na forum w .NET Framework Developer Center. Może zapewnić pewien wgląd.

(Dodaj do pliku konfiguracyjnego aplikacji.)

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
JasCav
źródło
2
Jak należy używać tej konfiguracji aplikacji do kompilacji NANT?
sagar 18.04.13
14

W zależności od wersji struktury, na którą celujesz, możesz zajrzeć tutaj, aby uzyskać poprawny ciąg:

http://msdn.microsoft.com/en-us/library/ee517334.aspx

Zmarnowałem godziny, próbując dowiedzieć się, dlaczego mój klient docelowy .Net 4.0 wymagał pełnej wersji. Użyłem tego na końcu:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
Anthony Wieser
źródło
11

Po ustawieniu pliku app.config Visual Studio wygeneruje kopię w folderze bin o nazwie App.exe.config . Skopiuj to do katalogu aplikacji podczas wdrażania. Brzmi oczywisto, ale zaskakująco wielu ludzi tęskni za tym krokiem. Programiści WinForms nie są wykorzystywani do konfigurowania plików :).

Raheel Khan
źródło
Innym sposobem jest usunięcie app.config, a następnie dodanie nowego z Project-> Add-> New item i wybranie General-> Application Configuration File (co nie jest tym samym, co utworzenie pliku tekstowego o nazwie app.config)
smirkingman
8

Używanie zestawów 2.0 i 4.0 razem nie jest całkiem proste.

ORDER obsługiwanych deklaracji ramowych w app.config faktycznie wpływa na wyjątek zgłaszanego trybu mieszanego. Jeśli zmienisz kolejność deklaracji, pojawi się błąd trybu mieszanego. To jest cel tej odpowiedzi.

Jeśli więc pojawia się błąd w aplikacji Windows Forms, spróbuj tego, głównie aplikacji Windows Forms.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

Lub jeśli projekt nie jest Windows Form. W projekcie sieciowym dodaj to do pliku web.config.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>
Wiser Web
źródło
7

Był w stanie rozwiązać problem poprzez dodanie elementu „startup” z zestawem atrybutów „useLegacyV2RuntimeActivationPolicy” .

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
</startup>

Musiał jednak umieścić go jako pierwszy element podrzędny tagu konfiguracji w App.config, aby zadziałał .

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....
Deshan
źródło
1
Co się stało z tym z version="v2.0"?
SamB
1
Numer kompilacji jest wymagany dla wersji 2.0, ale nie dla wersji 4.0, więc najwyższa wersja jest niepoprawna. Dno jest prawidłowe.
ickydime
5

Powyższe nie działało dla mnie (pracuję nad aplikacją internetową) - ale to ...

Edytuj plik sgen.exe.config w folderze (najpierw musiałem go utworzyć); C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Narzędzia (istnieje również jeden w folderze v7.0, ale nie musiałem go zmieniać, używam VS2012)

Treść XML powinna wyglądać tak (to samo w poprzednich odpowiedziach)

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>
MarkPm
źródło
5

Jeśli pracujesz w usłudze sieci Web, a zestaw v2.0 jest zależnością załadowaną przez WcfSvcHost.exe , musisz dołączyć

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

w pliku .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config

W ten sposób Visual Studio będzie w stanie wysyłać odpowiednie informacje za pośrednictwem modułu ładującego w czasie wykonywania.

MrBit
źródło
4

Natknąłem się na ten problem, gdy zmieniliśmy na Visual Studio 2015 . Żadna z powyższych odpowiedzi nie działała dla nas. W końcu działamy, dodając następujący plik konfiguracyjny do WSZYSTKICH plików wykonywalnych sgen.exe na komputerze

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

Szczególnie w tej lokalizacji, nawet gdy celowaliśmy w .NET 4.0:

C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Narzędzia

Uruchom CMD
źródło
czy mógłbyś to sprecyzować? Czy masz na myśli, że dodałeś tę opcję konfiguracji do wszystkich istniejących plików * .config lub że utworzyłeś plik .config dla sgen.exe?
Adam Spicer
Dla mnie miałem ten problem z projektami testowymi Visual Studio 2015. Ten post pomógł mi. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer
1
@AdamSpicer Dodaliśmy to do wszystkich plików .config wszystkich sgen.exe. Jeśli nie istniał, stworzyliśmy taki.
Uruchom CMD,
3

Użyłem tej konfiguracji:

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

Pracował dla mnie

OmriSela
źródło
3
powinien być v2.0.50727, dla wersji kompilacji v2.0 jest wymagany, ale dla wersji kompilacji v4.0 nie jest potrzebny
linquize
1

Miałem ten problem podczas aktualizacji do Visual Studio 2015 i żadne z opublikowanych tutaj rozwiązań nie miało znaczenia, chociaż konfiguracja jest odpowiednia, lokalizacja zmiany nie jest. Rozwiązałem ten problem, dodając tę ​​konfigurację:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

Do: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ TE.ProcessHost.Managed.exe.config

Następnie ponownie uruchomiłem Visual Studio.

Michael Armitage
źródło
0

Znalazłem sposób na obejście tego po 3-4 godzinach googlingu. Dodałem następujące

<startup selegacyv2runtimeactivationpolicy="true">
  <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

Jeśli to nie rozwiąże problemu, to -> W referencjach projektu, Right Click on DLLgdzie pojawia się błąd -> Select Properties-> Check the Run-time Version-> Jeśli tak, to v2.0.50727znamy problem. Problemem jest: - masz 2.0 Version of respective DLL. Rozwiązanie: - Możesz delete the respective DLLz referencji projektu, a następnie download the latest version of DLL'sz odpowiedniej strony internetowej i dodać referencję referencji DLL najnowszej wersji, to zadziała.

venu
źródło
1
Naprawiłoby to, ponieważ zakładasz, że najnowsza wersja biblioteki DLL jest skompilowana z nowszą wersją platformy .NET?
Lucas,
0

Wystąpił ten sam błąd i spędziłem wieczność na dodawaniu sugerowanych instrukcji uruchamiania do różnych plików konfiguracyjnych w moim rozwiązaniu, próbując wyodrębnić niezgodność środowiska. Nic nie działało. Dodałem również informacje o starcie do moich schematów XML . To też nie pomogło. Patrząc na rzeczywisty plik, który był przyczyną problemu (który powiedziałby tylko, że został „przeniesiony lub usunięty”), okazało się, że tak naprawdę był to Kompilator licencji (LC).

Usunięcie nieuczciwego pliku license.licx rozwiązało problem.

mono código
źródło
0

Napotkałem podobny problem podczas migracji części kodu z VS 2008 do VS 2010. Wprowadzenie zmian w pliku App.config rozwiązało problem.

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>
Sonali.thecoder
źródło
0

Dodaj w tym miejscu C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 Nazwa pliku: sgen.exe.config (Jeśli nie możesz znaleźć tego pliku, utwórz go i dodaj)

 <?xml version ="1.0"?>

<configuration>
 <runtime>        
        <generatePublisherEvidence enabled="false"/>    
    </runtime>

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

W ten sposób rozwiązano problem

Muheeb
źródło
0

Używam

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

Działa, ale tuż przed de </configuration>tag, w przeciwnym razie tag startowy nie działa poprawnie

RubenP5
źródło
-1

Również miałem ten problem z biblioteką klas, jeśli ktoś ma problem z biblioteką klas dodaną do głównej aplikacji. Poprostu dodaj

<startup useLegacyV2RuntimeActivationPolicy="true">

do głównej aplikacji, którą następnie wybierze biblioteka klas.

Raghulan Gowthaman
źródło
To niepełne rozwiązanie. w nazwach konfiguracji rozróżniana jest wielkość liter, a zapomniałeś U.
Chuck Dee