¿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?

jamone
fuente
3
Ver también: stackoverflow.com/questions/1604663/…
Mikhail el
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 Copsey
fuente
@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>
JasCav
fuente
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>
Anthony Wieser
fuente
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 :).

Raheel Khan
fuente
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>
Web más sabia
fuente
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>
  ......
....
Deshan
fuente
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>
MarkPm
fuente
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.

MrBit
fuente
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

Ejecute CMD
fuente
¿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

OmriSela
fuente
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.

Michael Armitage
fuente
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á.

venu
fuente
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.

mono código
fuente
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>
Sonali.thecoder
fuente
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

Muheeb
fuente
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

RubenP5
fuente
-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.

Raghulan Gowthaman
fuente
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