L'assembly in modalità mista è basato sulla versione 'v2.0.50727' del runtime


163

Ricevo la seguente eccezione:

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.

mentre stavo provando ad esportare report di cristallo dal mio programma WPF ...

Ho già aggiunto quanto segue in app.config ...

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
  <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

Qualsiasi esperto può aiutare ????

Riferimento che ho trovato: http://www.davidmoore.info/2010/12/17/running-net-2-runtime-applications-under-the-net-4-runtime


1
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 file:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

1
Ricorda che potresti non solo avere "C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Tools \", ma sotto quello, una directory 'x64' che ha anche un sgen. exe, e possibilmente diverse altre copie / versioni di sgen tutte in percorsi diversi, a seconda di quante e quali versioni di VS hai installato.
MickeyfAgain_BeforeExitOfSO,

@ToolmakerSteve Pubblica il tuo commento come risposta in modo che io possa votarlo; nessuna delle altre risposte mi ha aiutato.
Malcolm,

Risposte:


238

Prova a utilizzare questo esatto tag di avvio in app.config nel nodo di configurazione

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

2
In realtà dovresti aggiungere le linee difficili a YourApp. ** exe **. Config.
AntonK,

24
Questo è app.config. Il compilatore lo rinominerà al momento della compilazione.
Jeff,

65
L'unica parte richiesta è useLegacyV2RuntimeActivationPolicy = "true". È possibile lasciare la versione corrente del framework.
Ben Gripka,

3
Posso raddoppiare quando Ben dice, ho lasciato fuori il tempo di esecuzione aggiuntivo richiesto e il mio problema è andato via.
Mike Malter,

1
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,

85

L'eccezione identifica chiaramente alcuni componenti .NET 2.0.50727 inclusi in .NET 4.0. Nel file App.config utilizzare questo:

<startup useLegacyV2RuntimeActivationPolicy="true" /> 

Ha risolto il mio problema


Questo ha bisogno di una barra di chiusura<startup useLegacyV2RuntimeActivationPolicy="true" />
Jonn,

8

Aggiungi l'attributo useLegacyV2RuntimeActivationPolicy = "true" nel file app.config delle tue applicazioni.

Vecchio valore

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
  </startup>

Nuovo valore

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

Risolverà il tuo problema.


Bello sapere che ha funzionato per te. Grazie per il tuo commento !
Brijesh Kumar Tripathi,

4

In realtà ho avuto questo identico problema con la soluzione inversa . Avevo aggiornato un progetto .NET a .NET 4.0 e poi ripristinato a .NET 3.5. Il file app.config nel mio progetto ha continuato a presentare quanto segue che causava l'errore sopra riportato:

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

La soluzione per risolvere l'errore era ripristinare il riferimento 2.0 corretto come segue:

<startup>
  <supportedRuntime version="v2.0.50727"/>
</startup>

Pertanto, se un downgrade produce l'errore sopra riportato, potrebbe essere necessario eseguire il backup della versione supportata di .NET Framework.


1

Per me questo è stato lanciato durante l'esecuzione di unit test in MSTest(VS2015). Ho dovuto aggiungere

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

nel

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

Errore MSTest assembly in modalità mista in VS2015


1

Abilitare l'eredità da app.config non ha funzionato per me. Per motivi sconosciuti, la mia applicazione non stava attivando la politica di runtime V2. Ho trovato un lavoro da queste parti .

Abilitare l'eredità da app.config è un approccio consigliato ma in alcuni casi non funziona come previsto. Utilizzare il seguente codice con nell'applicazione principale per forzare il criterio Legacy V2:

public static class RuntimePolicyHelper
{
public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; }

static RuntimePolicyHelper()
{
    ICLRRuntimeInfo clrRuntimeInfo =
        (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(
            Guid.Empty, 
            typeof(ICLRRuntimeInfo).GUID);
    try
    {
        clrRuntimeInfo.BindAsLegacyV2Runtime();
        LegacyV2RuntimeEnabledSuccessfully = true;
    }
    catch (COMException)
    {
        // This occurs with an HRESULT meaning 
        // "A different runtime was already bound to the legacy CLR version 2 activation policy."
        LegacyV2RuntimeEnabledSuccessfully = false;
    }
}

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
private interface ICLRRuntimeInfo
{
    void xGetVersionString();
    void xGetRuntimeDirectory();
    void xIsLoaded();
    void xIsLoadable();
    void xLoadErrorString();
    void xLoadLibrary();
    void xGetProcAddress();
    void xGetInterface();
    void xSetDefaultStartupFlags();
    void xGetDefaultStartupFlags();

    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
    void BindAsLegacyV2Runtime();
}
}

1

Prova a utilizzare un altro file di configurazione (non quello del tuo progetto) e RESTART Visual Studio:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine.x86.exe.config
(32-bit)

o

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine.exe.config
(64-bit)

Espanderei su questo, perché aggirare il nativo .configche risiede in un'applicazione e in genere necessario per ulteriori configurazioni dell'applicazione non sarebbe una buona soluzione.
atconway

3
Per i test unitari, la modifica della configurazione deve avvenire nel file vstest.executionengine.x86.exe.config poiché tale eseguibile è il processo principale del codice che si sta testando. Questo problema è stato presumibilmente risolto in Visual Studio 2012 SP4, ma è ancora presente sul mio computer.
Brandon S

(Nota che non dovresti riavviare Visual Studio per rendere effettive le modifiche. Dovresti semplicemente terminare l'attività sui processi vstest. * Perché quelli restano in giro anche dopo il completamento dei test delle unità.)
Brandon S

Risolvendo questo perché mi ha portato al luogo reale in cui ho dovuto cambiare questo.
Janis S.

1

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. Contenuto minimo del file:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>

Fonte: SGEN Assembly in modalità mista

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.