Domanda

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 facendo useLegacyV2RuntimeActivationPolicy ? Non riesco a trovare alcuna documentazione al riguardo.

È stato utile?

Soluzione

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

  

Uno dei problemi recenti che abbiamo visto è 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 sulla 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'attributo useLegacyV2RuntimeActivationPolicy torna al caricamento di CLR 2.0.

Altri suggerimenti

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 è & # 8220; non di impatto & # 8221 ;. Non dovrebbe cambiare il comportamento dei componenti esistenti quando installato.

     

L'attributo useLegacyV2RuntimeActivationPolicy in sostanza ti consente di dire, & # 8220; Ho alcune dipendenze dalle API di shim legacy. Fai in modo che funzionino come prima rispetto al runtime scelto. & # 8221;

     

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 impattante l'installazione di v4, che potrebbe interrompere le app esistenti installate sul vostro computer.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top