Quale "configurazione aggiuntiva" è necessaria per fare riferimento a un assembly in modalità mista .NET 2.0 in un progetto .NET 4.0?


526

Ho un progetto in cui mi piacerebbe usare alcune delle funzionalità di .NET 4.0, ma un requisito fondamentale è che posso usare il framework System.Data.SQLite che viene compilato contro 2.X. Vedo che ciò è possibile come la risposta accettata qui, ma non vedo come raggiungerlo.

Quando provo ad eseguire il mio progetto 4.0 mentre faccio riferimento all'assembly 2.X ottengo:

L'assembly in modalità mista è basato sulla versione 'v2.0.50727' del runtime e non può essere caricato nel runtime 4.0 senza ulteriori informazioni di configurazione.

Quale "configurazione aggiuntiva" è necessaria?




IMPORTANTE: se l'errore si verifica con la colonna di errore "File" come SGEN, la correzione deve trovarsi in un file sgen.exe.config, accanto a sgen.exe. Ad esempio, per VS 2015, creare C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Fonte: SGEN Assemblaggio in modalità mista Contenuto minimo del file:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Risposte:


686

Per utilizzare un assembly in modalità mista CLR 2.0 , è necessario modificare il file App.Config per includere:

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

La chiave è la useLegacyV2RuntimeActivationPolicybandiera. Questo fa sì che il CLR usi l'ultima versione (4.0) per caricare l'assembly in modalità mista. Senza questo, non funzionerà.

Si noti che questo è importante solo per gli assembly in modalità mista (C ++ / CLI). È possibile caricare tutti gli assembly CLR 2 gestiti senza specificarlo inapp.config .


@Reed Ho provato il tuo suggerimento, ma l'eccezione si apre ancora. Ho ricontrollato l'app.config che viene copiato nella mia cartella EXE e non funziona ancora. Viene visualizzato quando si utilizza log4net. Non riesco a trovare nulla su questo errore in riferimento a: log4net tranne qui: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , ma non dice molto. Qualche idea su come posso ottenere maggiori informazioni sul mio problema specifico?
Dave,

@Dave: questo suggerisce che puoi semplicemente utilizzare una versione nativa .NET 4 di log4net, che sembra l'opzione migliore. Se esiste una versione .NET 4,
usala

@Reed non ce n'è uno, e in realtà ho interpretato quella risposta nel senso che dovresti compilare log4net da solo. Immagino di poterlo fare, ma preferirei semplicemente prendere il loro binario precompilato e fare riferimento al mio progetto. Ci penserò ancora. Ma riesci a capire perché cambiare app.config non lo fa funzionare? Ho pensato che forse avrei dovuto usare programname.exe.config, ma ci ho provato anche io e non ha funzionato. Nella mia esperienza limitata, entrambi i nomi dei file fanno la stessa cosa.
Dave,

19
Ciò che mi ha aiutato è stato inserire questa riga nel file di configurazione di NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </startup>
Filip Zawada

76
Microsoft dovrebbe creare un pulsante nella finestra di dialogo delle eccezioni: "Cerca questo messaggio di eccezione su StackOverflow"
Davi Fiamenghi,

35

Questo post nel forum sul Centro per sviluppatori .NET Framework. Potrebbe fornire alcune informazioni.

(Aggiungi al file di configurazione dell'app.)

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

2
Come deve essere utilizzata questa configurazione dell'app per la build NANT?
sagar,

14

A seconda della versione del framework a cui ti rivolgi, potresti voler guardare qui per ottenere la stringa corretta:

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

Ho perso ore a cercare di capire perché il mio rilascio mirava al client .Net 4.0 richiedeva la versione completa. L'ho usato alla fine:

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

11

Dopo aver impostato app.config file , visual studio genererà una copia nella cartella bin denominata App.exe.config . Copiarlo nella directory dell'applicazione durante la distribuzione. Sembra ovvio ma sorprendentemente molte persone mancano questo passaggio. Gli sviluppatori di WinForms non vengono utilizzati per configurare i file :).


Un altro modo è quello di eliminare app.config e quindi aggiungerne uno nuovo da Progetto-> Aggiungi-> Nuovo elemento e scegliere Generale-> File di configurazione dell'applicazione (che non è lo stesso della creazione di un file di testo chiamato app.config)
smirkingman

8

L'uso degli assiemi 2.0 e 4.0 insieme non è abbastanza semplice.

L'ORDINE delle dichiarazioni di framework supportate in app.config ha effettivamente un effetto sull'eccezione della modalità mista lanciata. Se si inverte l'ordine di dichiarazione si otterrà un errore in modalità mista. Questo è lo scopo di questa risposta.

Quindi, se ricevi l'errore in un'app di Windows Form, prova questo, principalmente app di Windows Form.

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

O se il progetto non è Windows Form. In un progetto Web, aggiungilo al file web.config.

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

7

È stato in grado di risolvere il problema aggiungendo l' elemento "startup" con il set di attributi "useLegacyV2RuntimeActivationPolicy" .

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

Ma ha dovuto posizionarlo come primo elemento figlio del tag di configurazione in App.config affinché abbia effetto .

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

1
Che cosa è successo a quello con version="v2.0"?
SamB

1
Il numero di build è richiesto per 2.0 ma non per 4.0, quindi la versione superiore non è corretta. Il fondo è corretto.
ickydime,

5

Quanto sopra non ha funzionato per me (sto lavorando su un'app Web) - ma questo ha fatto ...

Modifica il file sgen.exe.config nella cartella (prima dovevo crearne uno); C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (ce n'è anche uno nella cartella v7.0, ma non ho bisogno di cambiarlo, sto usando VS2012)

I contenuti dell'XML dovrebbero apparire così (lo stesso nelle risposte precedenti)

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

5

Se si sta lavorando in un servizio Web e l'assembly v2.0 è una dipendenza che è stata caricata da WcfSvcHost.exe, è necessario includere

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

in .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config di file

In questo modo, Visual Studio sarà in grado di inviare le informazioni giuste tramite il caricatore in fase di esecuzione.


4

Ho riscontrato questo problema quando siamo passati a Visual Studio 2015 . Nessuna delle risposte sopra ha funzionato per noi. Alla fine l'abbiamo funzionato aggiungendo il seguente file di configurazione a TUTTI gli eseguibili sgen.exe sulla macchina

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

Soprattutto in questa posizione, anche quando ci rivolgevamo a .NET 4.0:

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


Può essere più preciso? Vuoi dire che hai aggiunto queste opzioni di configurazione a tutti i file * .config esistenti o che hai creato un file .config per sgen.exe?
Adam Spicer,

Per quanto mi riguarda, ho riscontrato questo problema con Visual Studio 2015 Test Projects. Questo post mi ha aiutato. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer Abbiamo aggiunto questo a tutti i file .config di tutti i file sgen.exe. Se non esisteva nessuno, ne abbiamo creato uno.
Esegui CMD il

3

Ho usato questa configurazione:

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

Ha funzionato per me


3
dovrebbe essere v2.0.50727, per il numero di build v2.0 è richiesto, ma per il numero di build v4.0 non è necessario
linquize

1

Ho avuto questo problema durante l'aggiornamento a Visual Studio 2015 e nessuna delle soluzioni pubblicate qui ha fatto alcuna differenza, anche se la configurazione è corretta, la posizione per la modifica non lo è. Ho risolto questo problema aggiungendo questa configurazione:

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

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

Quindi riavviato Visual Studio.


0

Ho trovato un modo per aggirare questo dopo 3-4 ore di googling. Ho aggiunto quanto segue

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

Se questo non risolve il problema, allora -> Nei riferimenti di progetto in Right Click on DLLcui viene visualizzato l'errore -> Select Properties-> Check the Run-time Version-> In caso v2.0.50727affermativo, conosciamo il problema. Il problema è: - la 2.0 Version of respective DLL. soluzione è: - È possibile delete the respective DLLdai riferimenti del progetto e quindi download the latest version of DLL'sdal sito Web corrispondente e aggiungere il riferimento dell'ultima versione del riferimento DLL, quindi funzionerà.


1
Ciò lo risolverebbe perché stai supponendo che l'ultima versione della DLL sia compilata rispetto a una versione più recente di .NET?
Lucas,

0

Stavo riscontrando lo stesso errore e ho impiegato per sempre l'aggiunta delle istruzioni di avvio suggerite a vari file di configurazione nella mia soluzione, tentando di isolare la mancata corrispondenza del framework. Niente ha funzionato. Ho anche aggiunto informazioni di avvio ai miei schemi XML . Neanche questo ha aiutato. Guardando il file reale che stava causando il problema (che direbbe solo che è stato "spostato o eliminato") è emerso che era in realtà il License Compiler (LC).

L'eliminazione del file license.licx offensivo sembra aver risolto il problema.


0

Stavo affrontando un problema simile durante la migrazione di alcuni codici da VS 2008 a VS 2010 Apportare modifiche al file App.config ha risolto il problema per me.

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

0

Aggiungi il seguente in questa posizione C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName: sgen.exe.config (Se non trovi questo file, crealo e aggiungine uno)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

In questo modo il problema è stato risolto


0

Io uso

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

Funziona ma poco prima di de </configuration>tag altrimenti il ​​tag di avvio non funziona correttamente


-1

Inoltre ho avuto questo problema con la libreria di classi, se qualcuno ha il problema con la libreria di classi aggiunta all'applicazione principale. Basta aggiungere

<startup useLegacyV2RuntimeActivationPolicy="true">

alla tua applicazione principale che verrebbe quindi scelta dalla libreria di classi.


Questa è una soluzione incompleta. i nomi nella configurazione fanno distinzione tra maiuscole e minuscole e hai dimenticato una U.
Chuck Dee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.