Saltar al contenido

Recuperar la versión de Target Framework y el perfil de Target Framework de un ensamblado .Net

Solución:

Si está satisfecho con la versión del CLR que compiló el ensamblaje, puede usar el Assembly.ImageRuntimeVersion propiedad. Según MSDN, esa propiedad:

que representa la versión de Common Language Runtime (CLR) guardada en el archivo que contiene el manifiesto.

y

De forma predeterminada, ImageRuntimeVersion se establece en la versión de CLR utilizada para compilar el ensamblado. Sin embargo, es posible que se haya establecido en otro valor en el momento de la compilación.

Por supuesto, eso no le da la versión específica de .NET Framework (por ejemplo: .NET Frameworks 2, 3.0 y 3.5 están todos en 2.0 CLR).

Si la versión CLR no es suficiente, puede intentar ‘estimar’ (adivinar inteligentemente) qué versión debe basarse en los ensamblados a los que hace referencia. Para .NET 1 y 4, la versión CLR debería ser suficiente. Sin embargo, si la versión CLR fuera 2.0, no sabría si eso significa 2.0, 3.0 o 3.5, por lo que podría probar un poco más de lógica. Por ejemplo, si vio que el ensamblaje hacía referencia System.Core (utilizando Assembly.GetReferencedAssemblies()) entonces sabría que la versión es 3.5 ya que System.Core era nuevo en 3.5. Eso no es exactamente sólido como una roca, ya que es posible que el ensamblaje en cuestión no use ningún tipo del ensamblaje, por lo que no podrá captar eso. Para intentar detectar más casos, puede recorrer todos los ensamblados referenciados y verifique sus números de versión, tal vez filtrando solo ensamblados que comienzan con System para evitar falsos positivos con otras bibliotecas. Si ve algún ensamblado System. * Referenciado que tenga una versión de 3.5.xx, entonces también puede estar bastante seguro de que fue construido para 3.5.


Como habrás notado, no creo que TargetFrameworkProfile escapa más allá de Visual Studio. Sin embargo, si hay un archivo app.config para la aplicación, es posible que Visual Studio haya puesto el marco de destino allí. Por ejemplo, si configura el proyecto para usar el perfil de cliente 4.0, Visual Studio crea un app.config como este:

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
  </startup>
</configuration>

Si el ensamblaje se compiló con TargetFrameworkAttribute (con alcance de ensamblaje), puede determinar fácil y uniformemente el objetivo del perfil del marco.

Pruebe este ejemplo y haga referencia a sus propios ensamblados personalizados con diferentes destinos.

class Program
{
    static void Main(string[] args)
    {


        // Lets examine all assemblies loaded into the current application domain.
        var assems = AppDomain.CurrentDomain.GetAssemblies();

        // The target framework attribute used when the assemby was compiled.
        var filteredType = typeof(TargetFrameworkAttribute);

        // Get all assemblies that have the TargetFrameworkAttribute applied.
        var assemblyMatches = assems.Select(x => new { Assembly = x, TargetAttribute = (TargetFrameworkAttribute)x.GetCustomAttribute(filteredType) })
                                    .Where(x => x.TargetAttribute != null);

        // Report assemblies framework target
        foreach (var assem in assemblyMatches)
        {
            var framework = new System.Runtime.Versioning.FrameworkName(assem.TargetAttribute.FrameworkName);
            Console.WriteLine("Assembly: '{0}' targets .NET version: '{1}'.",
                                assem.Assembly.FullName,
                                framework.Version);
        }

        Console.ReadLine();
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *