El ensamblaje de modo mixto está construido contra la versión 'v2.0.50727' del tiempo de ejecución

163

Recibo la siguiente excepción:

El ensamblaje de modo mixto se compila con la versión 'v2.0.50727' del tiempo de ejecución y no se puede cargar en el tiempo de ejecución 4.0 sin información de configuración adicional.

mientras intentaba exportar un informe de cristal de mi programa WPF ...

He agregado lo siguiente en la app.config ya ...

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

¿Algún experto puede ayudar?

Referencia que encontré: http://www.davidmoore.info/2010/12/17/running-net-2-runtime-applications-under-the-net-4-runtime

Christina Wong
fuente
1
IMPORTANTE: si el error ocurre con la columna de error "Archivo" como SGEN, entonces la solución debe estar en un archivo sgen.exe.config, al lado de sgen.exe. Por ejemplo, para VS 2015, cree C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Fuente: conjunto de modo mixto SGEN Contenido mínimo del archivo:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve
1
Tenga en cuenta que puede que no solo tenga "C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Tools \", sino que debajo de eso, un directorio 'x64' que también tiene un sgen. exe, y posiblemente varias otras copias / versiones de sgen, todas en diferentes rutas, dependiendo de cuántas y qué versiones de VS haya instalado.
MickeyfAgain_BeforeExitOfSO
@ToolmakerSteve Por favor publique su comentario como respuesta para que pueda votarlo; Ninguna de las otras respuestas me ayudó.
Malcolm
@Malcolm - OK, publicado como respuesta
ToolmakerSteve

Respuestas:

238

Intente utilizar esta etiqueta de inicio exacta en su app.config en el nodo de configuración

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <requiredRuntime version="v4.0.20506" />
  </startup>
Talha
fuente
2
En realidad, debe agregar las líneas difíciles a YourApp. ** exe **. Config.
AntonK
24
Eso es app.config. El compilador lo cambiará de nombre al compilar.
Jeff
65
La única parte que se requiere es useLegacyV2RuntimeActivationPolicy = "true". Puedes dejar tu versión actual de framework.
Ben Gripka
3
Puedo doblar cuando Ben dice, omití el tiempo de ejecución adicional requerido y mi problema desapareció.
Mike Malter
1
Este enlace también debería ayudarlo a comprender cuál es el problema y cuál es la solución para usted: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
85

La excepción identifica claramente que algunos componentes .NET 2.0.50727 se incluyeron en .NET 4.0. En el archivo App.config use esto:

<startup useLegacyV2RuntimeActivationPolicy="true" /> 

Resolvió mi problema

Bibaswann Bandyopadhyay
fuente
Esto necesita una barra de cierre<startup useLegacyV2RuntimeActivationPolicy="true" />
Jonn
8

Agregue el atributo useLegacyV2RuntimeActivationPolicy = "true" en el archivo app.config de su aplicación.

Valor antiguo

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

Nuevo valor

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

Resolverá tu problema.

Brijesh Kumar Tripathi
fuente
Es bueno saber que funcionó para ti. Gracias por tu comentario !
Brijesh Kumar Tripathi
4

De hecho, tuve este problema idéntico con la solución inversa . Había actualizado un proyecto .NET a .NET 4.0 y luego volví a .NET 3.5. La app.config en mi proyecto continuó teniendo lo siguiente que estaba causando el error anterior en cuestión:

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

La solución para resolver el error para esto fue revertirlo a la referencia 2.0 correcta de la siguiente manera:

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

Por lo tanto, si una degradación produce el error anterior, es posible que deba hacer una copia de seguridad de la versión compatible con .NET Framework.

atconway
fuente
1

Para mí, esto fue arrojado al ejecutar pruebas unitarias bajo MSTest(VS2015). Tuvo que agregar

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

en

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

Error de MSTest de ensamblaje de modo mixto en VS2015

Janis S.
fuente
1

Habilitar el legado de app.config no funcionó para mí. Por razones desconocidas, mi aplicación no estaba activando la política de tiempo de ejecución V2. Encontré un trabajo por aquí .

Habilitar el legado de app.config es un enfoque recomendado, pero en algunos casos no funciona como se esperaba. Use el siguiente código en su aplicación principal para forzar la política de 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();
}
}
Talha Imam
fuente
1

Intente usar otro archivo de configuración (no el de su proyecto) y 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)
Alexander Tytarchuk
fuente
Extendería esto, porque eludir el nativo .configque reside en una aplicación y que normalmente se necesita para configuraciones de aplicaciones adicionales no sería una buena solución.
atconway
3
Para las pruebas unitarias, el cambio de configuración debe ocurrir en el archivo vstest.executionengine.x86.exe.config porque ese ejecutable es el proceso principal del código que está probando. Este problema supuestamente se solucionó en Visual Studio 2012 SP4, pero todavía está presente en mi máquina.
Brandon S
(Tenga en cuenta que no debería tener que reiniciar Visual Studio para que los cambios surtan efecto. Solo debería finalizar la tarea en los procesos vstest. * Porque esos se quedan incluso después de que se completen las pruebas de su unidad).
Brandon S
Mejorar esto ya que me llevó al lugar real donde tuve que cambiar esto.
Janis S.
1

Si el error ocurre con la columna de error "Archivo" como SGEN, entonces la solución debe estar en un archivo sgen.exe.config, al lado de sgen.exe. Por ejemplo, para VS 2015, cree C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Contenido mínimo del archivo:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>

Fuente: conjunto de modo mixto SGEN

ToolmakerSteve
fuente