Pregunta

Al convertir un proyecto que usaba SlimDX, y por lo tanto tiene un código no administrado, a .NET 4.0 me encontré con el siguiente error:

  

El ensamblaje de modo mixto se construye contra 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.

Googlear alrededor me dio la solución, que es agregar esto a la configuración de las aplicaciones:

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

Mi pregunta es, ¿qué está haciendo useLegacyV2RuntimeActivationPolicy ? No puedo encontrar ninguna documentación al respecto.

¿Fue útil?

Solución

Después de un poco de tiempo (y más búsquedas), encontré esta entrada de blog de Jomo Fisher.

  

Uno de los problemas recientes que hemos visto es que, debido al soporte para los tiempos de ejecución en paralelo, .NET 4.0 ha cambiado la forma en que se une a los ensamblajes de modo mixto más antiguos. Estos conjuntos son, por ejemplo, los que se compilan desde C ++ \ CLI. Los ensamblajes de DirectX actualmente disponibles son de modo mixto. Si ve un mensaje como este, sabrá que se ha topado con el problema:

     

El ensamblaje de modo mixto se construye contra la versión 'v1.1.4322' 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.

     

[Recorte]

     

La buena noticia para las aplicaciones es que tiene la opción de recurrir al enlace de la era .NET 2.0 para estos ensamblajes al establecer un distintivo app.config de este modo:

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

Parece que la forma en que el tiempo de ejecución carga los ensamblados en modo mixto ha cambiado. No puedo encontrar ningún detalle sobre este cambio o por qué se realizó. Pero el atributo useLegacyV2RuntimeActivationPolicy vuelve a la carga de CLR 2.0.

Otros consejos

Aquí hay una explicación que escribí recientemente para ayudar con el vacío de información sobre este atributo. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (enlace Wayback Machine del archivo de Internet)

Para citar los bits más relevantes:

  

[La instalación de .NET] v4 es & # 8220; no impactante & # 8221 ;. No debe cambiar el comportamiento de los componentes existentes cuando se instalan.

     

El atributo useLegacyV2RuntimeActivationPolicy básicamente te permite decir, & # 8220; Tengo algunas dependencias en las API de compatibilidad de compatibilidad heredadas. Por favor, hágalos trabajar como solían hacerlo con respecto al tiempo de ejecución elegido. & # 8221;

     

¿Por qué no & # 8217; t hacemos que este sea el comportamiento predeterminado? Podría argumentar que este comportamiento es más compatible y hace que portar el código de versiones anteriores sea mucho más fácil. Si recuerdas, este no puede ser el comportamiento predeterminado porque haría que la instalación de v4 fuera impactante, lo que puede romper aplicaciones existentes instaladas en tu máquina.

La publicación completa explica esto con más detalle. En RTM, los documentos de MSDN sobre esto deberían ser mejores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top