Welche zusätzliche Konfiguration ist erforderlich, um auf eine .NET 2.0-Assembly im gemischten Modus in einem .NET 4.0-Projekt zu verweisen?

526

Ich habe ein Projekt, in dem ich einige der .NET 4.0-Funktionen verwenden möchte, aber eine Grundvoraussetzung ist, dass ich das System.Data.SQLite-Framework verwenden kann, das gegen 2.X kompiliert wurde. Ich sehe die Erwähnung, dass dies möglich ist, wie die hier akzeptierte Antwort, aber ich sehe nicht, wie dies tatsächlich erreicht werden kann.

Wenn ich nur versuche, mein 4.0-Projekt auszuführen, während ich auf die 2.X-Assembly verweise, erhalte ich:

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.

Welche "zusätzliche Konfiguration" ist notwendig?

Jamone
quelle
WICHTIG: Wenn der Fehler mit der Fehlerspalte "Datei" als SGENauftritt, muss sich das Update in einer Datei sgen.exe.configneben befinden sgen.exe. Erstellen Sie beispielsweise für VS 2015 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Quelle: SGEN Assembly im gemischten Modus Mindestinhalt der Datei:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Antworten:

686

Um eine CLR 2.0- Assembly im gemischten Modus verwenden zu können , müssen Sie Ihre App.Config-Datei so ändern, dass sie Folgendes enthält:

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

Der Schlüssel ist die useLegacyV2RuntimeActivationPolicyFlagge. Dadurch verwendet die CLR die neueste Version (4.0), um Ihre Assembly im gemischten Modus zu laden. Ohne dies wird es nicht funktionieren.

Beachten Sie, dass dies nur für C ++ / CLI-Assemblys (Mixed Mode) von Bedeutung ist. Sie können alle verwalteten CLR 2-Assemblys laden, ohne dies anzugeben app.config.

Reed Copsey
quelle
@Reed Ich habe Ihren Vorschlag ausprobiert, aber die Ausnahme wird immer noch angezeigt. Ich habe die app.config, die in meinen EXE-Ordner kopiert wird, noch einmal überprüft und sie funktioniert immer noch nicht. Es wird angezeigt, wenn log4net verwendet wird. Ich kann nichts über diesen Fehler bezüglich: log4net finden, außer hier: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , aber es sagt nicht viel. Irgendwelche Ideen, wie ich mehr Informationen zu meinem speziellen Problem erhalten kann?
Dave
@ Dave: Das deutet darauf hin, dass Sie nur eine native .NET 4-Version von log4net verwenden können - das scheint die beste Option zu sein. Wenn es eine .NET 4-Version gibt, verwenden Sie sie ...
Reed Copsey
@Reed gibt es keine, und ich habe diese Antwort tatsächlich so interpretiert, dass Sie log4net selbst kompilieren müssten. Ich denke, ich kann das tun, aber ich würde lieber einfach ihre vorkompilierte Binärdatei nehmen und sie aus meinem Projekt referenzieren. Ich werde es noch etwas genauer untersuchen. Aber können Sie sich vorstellen, warum das Ändern von app.config nicht funktioniert? Ich dachte, ich müsste vielleicht programname.exe.config verwenden, aber das habe ich auch versucht und es hat nicht funktioniert. Nach meiner begrenzten Erfahrung macht jeder Dateiname dasselbe.
Dave
19
Was mir geholfen hat, war diese Zeile in die Konfigurationsdatei der NUnit zu setzen : <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </ startup>
Filip Zawada
76
Microsoft sollte eine Schaltfläche im Ausnahmedialog erstellen: "Diese Ausnahmemeldung auf Stackoverflow durchsuchen"
Davi Fiamenghi
35

Dieser Forumsbeitrag im .NET Framework Developer Center. Es könnte einen Einblick geben.

(Zur Konfigurationsdatei der App hinzufügen.)

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
JasCav
quelle
2
Wie sollte diese App-Konfiguration für den NANT-Build verwendet werden?
Sagar
14

Je nachdem, auf welche Version des Frameworks Sie abzielen, möchten Sie möglicherweise hier nachsehen, um die richtige Zeichenfolge zu erhalten:

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

Ich habe Stunden damit verschwendet, herauszufinden, warum für meinen Release .NET 4.0-Client die Vollversion erforderlich war. Ich habe das am Ende benutzt:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
Anthony Wieser
quelle
11

Sobald Sie die Datei app.config festgelegt haben , generiert Visual Studio eine Kopie im Ordner bin mit dem Namen App.exe.config . Kopieren Sie dies während der Bereitstellung in das Anwendungsverzeichnis. Klingt offensichtlich, aber überraschenderweise verpassen viele Leute diesen Schritt. WinForms-Entwickler werden nicht zum Konfigurieren von Dateien verwendet :).

Raheel Khan
quelle
Eine weitere Möglichkeit ist es, die app.config zu löschen und dann einen neuen von Ausbau-> Add-> Neuem Elemente hinzufügen , und wählen Sie Allgemein-> Anwendungskonfigurationsdatei (die nicht das gleiche ist , wie nur eine Textdatei namens app.config erstellen)
Grinsender
8

Die gemeinsame Verwendung von 2.0- und 4.0-Assemblys ist nicht ganz einfach.

Die ORDER der unterstützten Framework-Deklarationen in app.config wirkt sich tatsächlich auf die Ausnahme aus, dass der gemischte Modus ausgelöst wird. Wenn Sie die Deklarationsreihenfolge umdrehen, wird ein Fehler im gemischten Modus angezeigt. Dies ist der Zweck dieser Antwort.

Wenn Sie also den Fehler in einer Windows Forms-App erhalten, versuchen Sie dies, hauptsächlich Windows Forms-Apps.

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

Oder wenn das Projekt nicht Windows Form ist. Fügen Sie dies in einem Webprojekt zur Datei web.config hinzu.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>
Klügeres Web
quelle
7

War in der Lage , das Problem zu lösen , indem das Hinzufügen „startup“ Elements mit „useLegacyV2RuntimeActivationPolicy“ Attribute gesetzt.

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

Musste es aber als erstes untergeordnetes Element des Konfigurations-Tags in App.config platzieren, damit es wirksam wird .

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....
Deshan
quelle
1
Was ist mit dem passiert version="v2.0"?
SamB
1
Die Build-Nummer ist für 2.0 erforderlich, nicht jedoch für 4.0, daher ist die Top-Version falsch. Unten ist richtig.
Ickydime
5

Das obige hat bei mir nicht funktioniert (ich arbeite an einer Web-App) - aber das hat ...

Bearbeiten Sie die Datei sgen.exe.config im Ordner (ich musste zuerst eine erstellen); C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0-Tools (Es gibt auch einen im Ordner v7.0, aber ich musste diesen nicht ändern, ich verwende VS2012)

Die Inhalte des XML sollten so aussehen (wie in den vorherigen Antworten).

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>
MarkPm
quelle
5

Wenn Sie in einem Webdienst arbeiten und die v2.0-Assembly eine Abhängigkeit ist, die von WcfSvcHost.exe geladen wurde, müssen Sie einschließen

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

in der Datei .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config

Auf diese Weise kann Visual Studio zur Laufzeit die richtigen Informationen über den Loader senden.

MrBit
quelle
4

Ich bin auf dieses Problem gestoßen, als wir zu Visual Studio 2015 gewechselt sind . Keine der oben genannten Antworten hat bei uns funktioniert. Am Ende haben wir es geschafft, indem wir die folgende Konfigurationsdatei zu ALLEN ausführbaren Dateien von sgen.exe auf dem Computer hinzugefügt haben

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

Besonders an diesem Ort, auch wenn wir auf .NET 4.0 abzielten:

C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Tools

Führen Sie CMD aus
quelle
kannst du genauer sein? Meinen Sie damit, dass Sie diese Konfigurationsoptionen zu allen vorhandenen * .config-Dateien hinzugefügt oder eine .config-Datei für sgen.exe erstellt haben?
Adam Spicer
Für mich hatte ich dieses Problem mit Visual Studio 2015-Testprojekten. Dieser Beitrag hat mir geholfen. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer
1
@AdamSpicer Wir haben dies zu allen .config-Dateien aller sgen.exe hinzugefügt. Wenn es keine gab, haben wir eine erstellt.
Führen Sie CMD
3

Ich habe diese Konfiguration verwendet:

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

Hat für mich gearbeitet

OmriSela
quelle
3
sollte v2.0.50727 sein, für v2.0 ist eine Build-Nummer erforderlich, für v4.0 ist jedoch keine Build-Nummer erforderlich
Linquize
1

Ich hatte dieses Problem beim Upgrade auf Visual Studio 2015 und keine der hier veröffentlichten Lösungen machte einen Unterschied, obwohl die Konfiguration stimmt, der Speicherort für die Änderung nicht. Ich habe dieses Problem durch Hinzufügen dieser Konfiguration behoben:

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

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

Starten Sie dann Visual Studio neu.

Michael Armitage
quelle
0

Nach 3-4 Stunden Googeln habe ich einen Weg gefunden, dies zu umgehen. Ich habe folgendes hinzugefügt

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

Wenn dies Ihr Problem nicht löst, dann -> In den Projektreferenzen, in Right Click on DLLdenen Sie Fehler erhalten -> Select Properties-> Check the Run-time Version-> Wenn dies der Fall ist v2.0.50727, kennen wir das Problem. Das Problem ist: - Sie haben eine 2.0 Version of respective DLL. Lösung: - Sie können delete the respective DLLaus den Projektreferenzen und dann download the latest version of DLL'svon der entsprechenden Website die Referenz der neuesten Version der DLL-Referenz hinzufügen, dann wird es funktionieren.

venu
quelle
1
Dies würde das Problem beheben, da Sie davon ausgehen, dass die neueste Version der DLL gegen eine neuere Version von .NET kompiliert wurde.
Lucas
0

Ich hatte denselben Fehler und habe die vorgeschlagenen Startanweisungen für immer zu verschiedenen Konfigurationsdateien in meiner Lösung hinzugefügt, um zu versuchen, die Nichtübereinstimmung des Frameworks zu isolieren. Nichts hat geklappt. Ich habe meinen XML-Schemas auch Startinformationen hinzugefügt . Das hat auch nicht geholfen. Ein Blick auf die eigentliche Datei, die das Problem verursacht hat (was nur bedeuten würde, dass sie "verschoben oder gelöscht" wurde), ergab, dass es sich tatsächlich um den License Compiler (LC) handelt.

Das Löschen der beleidigenden Datei licenses.licx scheint das Problem behoben zu haben.

mono código
quelle
0

Beim Migrieren von Code von VS 2008 nach VS 2010 trat ein ähnliches Problem auf. Durch Ändern der Datei App.config wurde das Problem für mich behoben.

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>
Sonali.thecoder
quelle
0

Fügen Sie an dieser Stelle Folgendes hinzu: C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 Dateiname: sgen.exe.config (Wenn Sie diese Datei nicht finden, erstellen Sie eine und fügen Sie sie hinzu.)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Dadurch wurde das Problem behoben

Muheeb
quelle
0

Ich benutze

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

Es funktioniert, aber kurz vor dem De- </configuration>Tag, sonst funktioniert das Start-Tag nicht richtig

RubenP5
quelle
-1

Außerdem hatte ich dieses Problem mit der Klassenbibliothek. Wenn jemand das Problem mit der Klassenbibliothek zu Ihrer Hauptanwendung hinzugefügt hat. Einfach hinzufügen

<startup useLegacyV2RuntimeActivationPolicy="true">

an Sie Hauptanwendung, die dann von der Klassenbibliothek ausgewählt würde.

Raghulan Gowthaman
quelle
Dies ist eine unvollständige Lösung. Die Namen in der Konfiguration unterscheiden zwischen Groß- und Kleinschreibung, und Sie haben ein U vergessen.
Chuck Dee