2012-01-31 19 views
7

Digamos que tengo dos proyectos, P4 y P3, dirigidos a .NET 4.0 y 3.5 respectivamente.¿Puede mi aplicación .Net hacer referencia a dos versiones diferentes de una biblioteca de .NET Framework?

Cada proyecto también tiene una referencia a System.Data. En el caso de P4, será a System.Data v4.0.0.0 En el caso de P3, será a System.Data v2.0.0.0

P4 proyecto también hace referencia a P3.

Si P4 se carga y se ejecuta, utiliza .NET 4.0 CLR. En tiempo de ejecución, las referencias a System.Data parecen resolverse a v4.0 dentro de P4 y P3. Puedo anular esto mediante el uso de redireccionamientos de unión de conjunto, pero luego tanto P4 como P3 se resuelven a v2.0.

¿Hay alguna manera de configurar mi aplicación para que P4 use v4.0 y P3 use v2.0?

Respuesta

3

Si tiene control sobre P3, sí. Vaya a la sección de referencias del proyecto, busque la referencia de System.Data y vea su ventana de propiedades (haga clic con el botón derecho en -> Propiedades).

Seleccione "Verdadero" para la propiedad "Versión específica". Recompile, vuelva a desplegar, etc.

Tenga en cuenta que esto provocará todo tipo de fallas en el tiempo de ejecución si .NET 2, 3 o 3.5 no están instalados en la máquina cuando el ensamblaje intenta cargar.

Editar

He intentado esto, pero sin suerte. P3 todavía ejecuta v4.0. ¿Sabes si esta configuración tendría algún efecto visible en el conjunto generado para P3? P.ej. El manifiesto dice ".ver 2: 0: 0: 0" si "Versión específica" se establece en verdadero o no.

Trate de añadir esto a su app.config:

<configuration> 
    <startup> 
    <supportedRuntime version="v2.0.50727" /> 
    <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 
+0

He intentado esto, pero sin suerte. P3 todavía ejecuta v4.0. ¿Sabes si esta configuración tendría algún efecto visible en el conjunto generado para P3? P.ej. El manifiesto dice ".ver 2: 0: 0: 0" si "Versión específica" se establece en verdadero o no. – Rob

+1

Sí, eso es lo que hice siguiendo el consejo de Seb. También necesitaba especificar useLegacyV2RuntimeActivationPolicy = "true" como un atributo en la etiqueta de inicio. De lo contrario, se bloqueó con Excepción no controlada: System.BadImageFormatException – Rob

+0

Impresionante. Su enlace fue lo que me recordó sobre la configuración, así que definitivamente acepte su respuesta. – Randolpho

4

Tener un vistazo a esto: In-Process Side-by-Side Podría ser de alguna ayuda.

+1

Sí - ¡eso funcionó! – Rob

+0

Lo siento. Soy un idiota. Lamentablemente, esto no ha ayudado, a menos que me falta algo. Me las arreglé para descomentar la redirección de unión de ensamblaje mientras comprobaba esto. Sin la redirección, no funciona. – Rob

Cuestiones relacionadas