Cosa fa 'useLegacyV2RuntimeActivationPolicy' nella configurazione di .NET 4?


214

Durante la conversione di un progetto che utilizzava SlimDX e quindi ha un codice non gestito, in .NET 4.0 ho riscontrato il seguente errore:

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.

Googling around mi ha dato la soluzione, che è quella di aggiungere questo alla configurazione delle applicazioni:

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

La mia domanda è: cosa sta useLegacyV2RuntimeActivationPolicyfacendo? Non riesco a trovare alcuna documentazione al riguardo.

Risposte:


165

Dopo un po 'di tempo (e più ricerche), ho trovato questo post sul blog di Jomo Fisher.

Uno dei problemi recenti che abbiamo riscontrato è che, a causa del supporto dei runtime affiancati, .NET 4.0 ha cambiato il modo in cui si lega agli assiemi in modalità mista precedenti. Questi assembly sono, ad esempio, quelli compilati da C ++ \ CLI. Gli assembly DirectX attualmente disponibili sono in modalità mista. Se vedi un messaggio come questo, sai che hai riscontrato il problema:

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

[Omissis]

La buona notizia per le applicazioni è che hai la possibilità di ricorrere al binding dell'era .NET 2.0 per questi assembly impostando un flag app.config in questo modo:

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

Quindi sembra che il modo in cui il runtime carica gli assembly in modalità mista sia cambiato. Non riesco a trovare alcun dettaglio su questa modifica o sul perché è stata eseguita. Ma l' useLegacyV2RuntimeActivationPolicyattributo ritorna al caricamento di CLR 2.0.


28
Vale la pena di notare qui che nel frattempo marklios rispondere ( stackoverflow.com/questions/1604663/... ) fornisce un collegamento per la sua spiegazione approfondita per quanto riguarda questo cambiamento.
Steffen Opel,

1
Una spiegazione approfondita di ciò può essere trovata su MSDN (anche se non menziona esplicitamente la soluzione sopra menzionata): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane

Che cosa succede se ho aggiunto questo sia alla configurazione per la mia applicazione sia a una configurazione per il mio progetto UnitTest e sto ancora ricevendo un errore di caricamento del file durante l'esecuzione dei test. Devo pubblicare una nuova domanda?
Nome in codice:

126

Ecco una spiegazione che ho scritto di recente per aiutare con il vuoto di informazioni su questo attributo. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (collegamento Internet Wayback Machine link)

Per citare i bit più rilevanti:

[Installazione di .NET] v4 è "senza impatto". Non dovrebbe cambiare il comportamento dei componenti esistenti quando installato.

L'attributo useLegacyV2RuntimeActivationPolicy consente sostanzialmente di dire: "Ho alcune dipendenze dalle API di shim legacy. Si prega di farli funzionare come prima rispetto al tempo di esecuzione scelto. "

Perché non rendiamo questo il comportamento predefinito? Si potrebbe obiettare che questo comportamento è più compatibile e rende molto più semplice il porting del codice dalle versioni precedenti. Se ricorderete, questo non può essere il comportamento predefinito perché renderebbe l'installazione di v4 di impatto, il che può interrompere le app esistenti installate sul computer.

Il post completo spiega questo in modo più dettagliato. Alla RTM, i documenti MSDN su questo dovrebbero essere migliori.


user20493, puoi eseguire la tua app con la variabile di ambiente COMPlus_CLRLoadLogDir impostata su una directory vuota a cui l'app ha accesso in scrittura e condividere i log risultanti (per favore pulisci per qualsiasi PII prima di condividerla). Potrebbe aiutare a spiegare cosa sta succedendo. L'attributo config potrebbe non essere applicato al contesto in cui l'app è in esecuzione.
Mark Miller,

Questo link dovrebbe anche aiutarti a capire qual è il problema e cosa sta facendo la soluzione per te: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane,
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.