¿Qué hace ‘useLegacyV2RuntimeActivationPolicy’ en la configuración de .NET 4?

Mientras convertía un proyecto que usaba SlimDX, y por lo tanto tenía un código no administrado, a .NET 4.0 me encontré con el siguiente error:

El ensamblado de modo mixto se comstack 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.

Buscar en Google me dio la solución, que es agregar esto a la configuración de las aplicaciones:

     

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

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

Uno de los problemas recientes que hemos visto es que, debido a la compatibilidad con los tiempos de ejecución paralelos, .NET 4.0 ha cambiado la forma en que se une a los ensamblajes antiguos de modo mixto. Estos ensamblados son, por ejemplo, los que se comstackn desde C ++ \ CLI. Los ensamblajes DirectX actualmente disponibles son de modo mixto. Si ve un mensaje como este, sabrá que se ha encontrado con el problema:

El ensamblado de modo mixto se comstack con 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 .NET 2.0 era para estos ensamblajes configurando un indicador de app.config de la siguiente manera:

    

Por lo tanto, 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 hizo. Pero el atributo useLegacyV2RuntimeActivationPolicy revierte a la carga de CLR 2.0.

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 de la máquina Wayback de Internet Archive)

Para citar los bits más relevantes:

[Instalar .NET] v4 es “no impactante”. No debe cambiar el comportamiento de los componentes existentes cuando está instalado.

El atributo useLegacyV2RuntimeActivationPolicy básicamente le permite decir: “Tengo algunas dependencias en las API de shim heredadas. Por favor, haz que funcionen como solían hacerlo con respecto al tiempo de ejecución elegido “.

¿Por qué no hacemos esto el comportamiento predeterminado? Podría argumentar que este comportamiento es más compatible y hace que el código de portado de versiones anteriores sea mucho más fácil. Si recuerda, este no puede ser el comportamiento predeterminado porque haría la instalación de v4 impactante, lo que puede romper las aplicaciones existentes instaladas en su máquina.

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