c# - significado - Mezclando.NET 3.5 con 4/4.5 ensamblajes en el mismo proceso
clr sql (3)
Si tiene un ensamblado 3.5 referenciado desde un ejecutable 4.5, ambos ensamblados se ejecutarán en el entorno CLR del 4.5. Sin embargo, el conjunto 3.5 apuntará a las bibliotecas v3.5, no a la v4.0 (aunque las bibliotecas 4.0 tendrán la misma funcionalidad que la 3.5, y más).
Por lo tanto, al menos en mi experiencia, si desea que los conjuntos tengan como objetivo 2.0-3.5 y otros conjuntos que tengan como objetivo 4.0-4.5, necesitará tener instaladas las versiones de 3.5 y 4.5 framework en el equipo cliente. 3.5 es totalmente compatible con versiones anteriores a 2.0, por lo que puede tener 3.5, 3.0 y 2.0 todos ejecutándose en un entorno. 4.0-4.5 es compatible con la mayoría de los códigos antiguos, pero hay algunos cambios importantes (CAS es un caso en el que me topé recientemente), y tienes que apuntar explícitamente a 4.0 (o configurar una clave App.config SupportedRuntime).
Me gustaría migrar una aplicación basada en .NET 3.5 WinForms a la última versión de .NET (4.5).
La aplicación utiliza componentes "externos" (que se pueden considerar como complementos) que también se basan actualmente en .NET 3.5.
Me gustaría saber qué bibliotecas de tiempo de ejecución / núcleo se utilizan en caso de que convirtamos SÓLO LA APLICACIÓN para compilar utilizando .NET 4.5.
¿Debería este escenario funcionar correctamente? (cargando ensamblajes .NET 3.5 en un proceso 4.5)? * Los ensamblajes de complementos se cargan mediante reflexión.
¿Cómo maneja el tiempo de ejecución de CLR tal escenario? ¿Es esta una práctica segura?
Todos los ensamblajes usarán tipos de .NET Framework a los que se dirige la aplicación.
Aquí hay una prueba simple:
Proyecto '' Net2Library '' que es una biblioteca de clases de .NET Framework 2.0 con la siguiente clase:
using System;
using System.Collections.Generic;
namespace Net2Library
{
public class Class1
{
public static List<string> GetStrings()
{
var strings = new List<string>();
Console.WriteLine("From Net2Library: {0}", strings.GetType().AssemblyQualifiedName);
return strings;
}
}
}
Proyecto '' Net4Application '' que es una aplicación de consola de .NET Framework 4.0 que hace referencia a Net2Library.dll y tiene la siguiente clase:
using System;
using Net2Library;
namespace Net4Application
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("From Net4Application: {0}", Class1.GetStrings().GetType().AssemblyQualifiedName);
}
}
}
La salida de la consola será:
De Net2Library: System.Collections.Generic.List`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]], mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 De Net4Application: System.Collections.Generic.List`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]], mscorlib, Version = 4.0.0.0, Culture = Anonymous, Public Zone = b77a5c561934e089
También puede consultar los siguientes recursos: Visión general de unificación de ensamblados de .NET Framework y redirección de enlace de ensamblaje .
Si recompiló el EXE principal de su aplicación para apuntar a .NET 4.xo use un archivo app.exe.config con el elemento <supportedRuntime>
para forzar la utilización de CLR versión 4, entonces no tendrá problemas al usar .NET Montajes 3.5 y .NET 4.0. CLR v4 no tiene problemas para leer ensamblajes 3.5, es compatible con versiones anteriores. No al revés, CLR v2 no puede leer los ensamblados de la versión 4, por lo que necesita el archivo .config si su EXE no está apuntando a v4.
El único problema son las dependencias que tiene su ensamblaje 3.5 en los ensamblajes de marcos antiguos. Por ejemplo, pedirá la versión 2.0.0.0 de mscorlib.dll. El CLR traduce automáticamente esas solicitudes y las reemplaza con la versión 4.0.0.0. Que en general funciona bien, los ensambles de framework estándar 4.0 son muy compatibles con las versiones anteriores.
Sin embargo, Microsoft aprovechó la oportunidad con 4.0 como una nueva versión de lado a lado y corrigió errores antiguos que no podían solucionarse fácilmente sin arriesgarse a romper el código que accidentalmente se basaba en el comportamiento del buggy. Son insectos muy oscuros y es bastante improbable que estas correcciones de errores te atraviesen. Sin embargo, tienes que volver a probar tu código para asegurarte.