¿Qué 'configuración adicional' es necesaria para hacer referencia a un ensamblado de modo mixto .NET 2.0 en un proyecto .NET 4.0?


526

Tengo un proyecto en el que me gustaría usar algunas de las características de .NET 4.0, pero un requisito fundamental es que puedo usar el marco System.Data.SQLite que se compila contra 2.X. Veo mención de que esto es posible, como la respuesta aceptada aquí, pero no veo cómo lograrlo.

Cuando solo intento ejecutar mi proyecto 4.0 mientras hago referencia al ensamblado 2.X obtengo:

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.

¿Qué "configuración adicional" es necesaria?




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

Respuestas:


686

Para utilizar un ensamblaje de modo mixto CLR 2.0 , debe modificar su archivo App.Config para incluir:

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

La clave es la useLegacyV2RuntimeActivationPolicybandera. Esto hace que el CLR use la última versión (4.0) para cargar su ensamblaje de modo mixto. Sin esto, no funcionará.

Tenga en cuenta que esto solo es importante para los conjuntos de modo mixto (C ++ / CLI). Puede cargar todos los ensamblados de CLR 2 administrados sin especificar esto en app.config.


@Reed He probado tu sugerencia, pero la excepción sigue apareciendo. He verificado dos veces la aplicación.config que se copia en mi carpeta EXE y todavía no funciona. Aparece cuando se usa log4net. No puedo encontrar nada sobre este error re: log4net, excepto aquí: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , pero no dice mucho. ¿Alguna idea sobre cómo puedo obtener más información sobre mi problema particular?
Dave

@Dave: Eso sugiere que puede usar una versión nativa .NET 4 de log4net, que parece ser la mejor opción. Si hay una versión .NET 4, úsela ...
Reed Copsey

@Reed no hay una, e interpreté esa respuesta en el sentido de que tendría que compilar log4net usted mismo. Creo que puedo hacer eso, pero prefiero tomar su binario precompilado y hacer referencia a él desde mi proyecto. Lo investigaré un poco más. Pero, ¿puedes pensar por qué cambiar app.config no hace que funcione? Pensé que tal vez tenía que usar programname.exe.config, pero también lo intenté y no funcionó. En mi experiencia limitada, cualquier nombre de archivo hace lo mismo.
Dave

19
Lo que me ayudó fue poner esta línea en el archivo de configuración de NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </startup>
Filip Zawada

76
Microsoft debería hacer un botón en el cuadro de diálogo de excepción: "Buscar este mensaje de excepción en stackoverflow"
Davi Fiamenghi

35

Esta publicación del foro en .NET Framework Developer Center. Puede proporcionar alguna idea.

(Agregar al archivo de configuración de la aplicación).

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

2
¿Cómo se debe usar esta configuración de la aplicación para la compilación NANT?
sagar

14

Dependiendo de la versión del marco al que se dirige, es posible que desee buscar aquí para obtener la cadena correcta:

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

Perdí horas tratando de averiguar por qué mi lanzamiento dirigido al cliente .Net 4.0 requería la versión completa. Usé esto al final:

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

11

Una vez que configure el archivo app.config , Visual Studio generará una copia en la carpeta bin denominada App.exe.config . Copie esto en el directorio de la aplicación durante la implementación. Suena obvio pero, sorprendentemente, mucha gente pierde este paso. Los desarrolladores de WinForms no están acostumbrados a configurar archivos :).


Otra forma es eliminar app.config y luego agregar uno nuevo desde Project-> Add-> New item y elegir General-> Application Configuration File (que no es lo mismo que crear un archivo de texto llamado app.config)
smirkingman

8

Usar conjuntos 2.0 y 4.0 juntos no es del todo sencillo.

El ORDEN de las declaraciones de marco admitidas en app.config en realidad tiene un efecto sobre la excepción del modo mixto que se lanza. Si cambia el orden de la declaración, obtendrá un error de modo mixto. Este es el propósito de esta respuesta.

Entonces, si obtiene el error en una aplicación de Windows Forms, intente esto, principalmente aplicaciones de Windows Forms.

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

O si el proyecto no es Windows Form. En un proyecto web, agregue esto al archivo web.config.

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

7

Pude resolver el problema agregando el elemento "inicio" con el conjunto de atributos "useLegacyV2RuntimeActivationPolicy" .

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

Pero tuvo que colocarlo como el primer elemento hijo de la etiqueta de configuración en App.config para que surta efecto .

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

1
¿Qué pasó con el que está version="v2.0"?
SamB

1
El número de compilación es obligatorio para 2.0 pero no para 4.0, por lo que la versión superior es incorrecta. La parte inferior es correcta.
ickydime

5

Lo anterior no funcionó para mí (estoy trabajando en una aplicación web), pero esto sí ...

Edite el archivo sgen.exe.config en la carpeta (tuve que crear uno primero); C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (También hay uno en la carpeta v7.0, pero no necesité cambiarlo, estoy usando VS2012)

Los componentes del XML deberían verse así (igual en respuestas anteriores)

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

5

Si está trabajando en un servicio web y el ensamblado v2.0 es una dependencia que ha sido cargada por WcfSvcHost.exe, entonces debe incluir

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

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

De esta manera, Visual Studio podrá enviar la información correcta a través del cargador en tiempo de ejecución.


4

Me encontré con este problema cuando cambiamos a Visual Studio 2015 . Ninguna de las respuestas anteriores funcionó para nosotros. Al final lo hicimos funcionar agregando el siguiente archivo de configuración a TODOS los ejecutables sgen.exe en la máquina

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

Particularmente en esta ubicación, incluso cuando estábamos apuntando a .NET 4.0:

C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Herramientas


¿Puedes ser mas específico? ¿Quiere decir que agregó estas opciones de configuración a todos los archivos * .config existentes o que creó un archivo .config para sgen.exe?
Adam Spicer

Para mi estaba teniendo este problema con los proyectos de prueba de Visual Studio 2015. Esta publicación me ayudó. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer Agregamos esto a todos los archivos .config de todos los sgen.exe. Si no existía ninguno, creamos uno.
Ejecute CMD el

3

Usé esta configuración:

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

Trabajó para mi


3
debe ser v2.0.50727, para v2.0 se requiere el número de compilación, pero para v4.0 no se necesita el número de compilación
linquize

1

Tuve este problema al actualizar a Visual Studio 2015 y ninguna de las soluciones publicadas aquí hizo ninguna diferencia, aunque la configuración es correcta, la ubicación del cambio no lo es. Solucioné este problema agregando esta configuración:

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

Para: C: \ Archivos de programa (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ TE.ProcessHost.Managed.exe.config

Luego reinició Visual Studio.


0

Encontré una forma de evitar esto después de 3-4 horas de googlear. He agregado lo siguiente

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

Si esto no resuelve su problema, entonces -> En las referencias del proyecto Right Click on DLLdonde obtiene el error -> Select Properties-> Check the Run-time Version-> Si es así, v2.0.50727entonces conocemos el problema. El problema es: - está teniendo la 2.0 Version of respective DLL. solución es: - Puede delete the respective DLLdesde las referencias del proyecto y luego download the latest version of DLL'sdesde el sitio web correspondiente y agregar la referencia de la última versión de referencia DLL y luego funcionará.


1
Esto lo solucionaría porque está asumiendo que la última versión de la DLL está compilada con una versión más nueva de .NET.
Lucas

0

Estaba experimentando este mismo error, y pasé para siempre agregando las declaraciones de inicio sugeridas a varios archivos de configuración en mi solución, intentando aislar el desajuste del marco. Nada funcionó. También agregué información de inicio a mis esquemas XML . Eso tampoco ayudó. Al observar el archivo real que estaba causando el problema (que solo diría que fue "movido o eliminado") reveló que en realidad era el Compilador de Licencia (LC).

Eliminar el archivo ofensivo licens.licx parece haber solucionado el problema.


0

Estaba enfrentando un problema similar mientras migraba un código de VS 2008 a VS 2010. Realizar cambios en el archivo App.config resolvió el problema por mí.

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

0

Agregue lo siguiente en esta ubicación C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName: sgen.exe.config (Si no encuentra este archivo, cree y agregue uno)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Hacer esto resolvió el problema


0

Yo suelo

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

Funciona, pero justo antes de la </configuration>etiqueta, de lo contrario, la etiqueta de inicio no funciona correctamente


-1

También tuve este problema con la biblioteca de clases, si alguien tiene el problema con la biblioteca de clases agregada a su aplicación principal. Solo agrega

<startup useLegacyV2RuntimeActivationPolicy="true">

a su aplicación principal que luego sería seleccionada por la biblioteca de la clase.


Esta es una solución incompleta. los nombres en la configuración distinguen entre mayúsculas y minúsculas, y olvidaste una U.
Chuck Dee
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.