.net - type - what can be done with reflection in c#
Determinar si un ensamblaje es parte del framework.NET (7)
Si sabe que ninguno de sus DLL estará en el GAC, puede verificar si cada ensamblaje está en el GAC o no. Si es así, no lo copie. Si no es así, entonces cópielo. Hay una propiedad en la clase Assembly llamada GlobalAssemblyCache. Obviamente, esto funcionaría mejor en algunas situaciones que en otras.
¿Cómo puedo decir a partir del nombre del ensamblado, o clase de ensamblaje (u otros similares), si un ensamblaje es parte del marco .NET (es decir, System.windows.Forms
)?
Hasta ahora he considerado las propiedades PublicKeyToken y CodeBase, pero estas no son siempre las mismas para todo el framework.
El motivo por el que deseo esta información es obtener una lista de ensamblados que utiliza mi archivo EXE que deben estar en máquinas cliente, de modo que pueda empaquetar los archivos correctos en un archivo de instalación sin usar el sistema de instalación de Visual Studio. El problema es que no quiero recoger ningún ensamblado de .NET framework, y quiero que sea un proceso automático que sea fácil de implementar cada vez que finalice una actualización importante.
La solución definitiva sería que hay una propiedad IsFramework ... :)
Para lograr esto, estoy usando el nombre del producto incrustado en el ensamblaje a través de AssemblyProductAttribute.
var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");
Estoy usando esta técnica para agrupar ensamblajes por producto en la pantalla Acerca de de la aplicación y parece funcionar bien para mí.
Tuve que lidiar con el mismo problema. Desafortunadamente, todas las respuestas dadas hasta ahora son insuficientes para determinar con seguridad si un ensamblaje es parte de .NET Framework.
Microsoft coloca una clase llamada FXAssembly
en el espacio de nombres global de cada ensamblaje de estructura con una cadena const que indica la versión:
.class private abstract auto ansi sealed beforefieldinit FXAssembly
extends [mscorlib]System.Object
{
.field assembly static literal string Version = string(''2.0.0.0'')
}
Use este "marcador" para verificar si un ensamblaje es un ensamblaje de armazón. Comprobar la clave pública tampoco le hará daño.
Cuando instala Visual Studio, obtiene los ensamblados de referencia en varias subcarpetas del formato C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/{FrameworkName}/{FrameworkVersion}
- lo más interesante podría ser la RedistList/FrameworkList.xml
Archivo RedistList/FrameworkList.xml
que contiene una lista de todos los nombres de ensamblados que se enviaron con la versión de marco dada.
Por ejemplo, C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.0/RedistList/FrameworkList.xml
parece contener una lista de todos los ensamblados de Framework de .NET 4.0.
Puede usar fácilmente estos archivos para establecer listas blancas estáticas de conjuntos.
No, no comienza con "Sistema". Puede marcar "WindowsBase", que es un ensamblaje de marco.
Tampoco puede comprobar PublicKeyToken, porque hay otros ensamblados de Microsoft firmados con las claves "predeterminadas", pero no forman parte de .NET Framework (ensamblados de Visual Studio).
La mejor forma de hacerlo es obtener una colección de marcos .NET instalados y verificar si el ensamblaje de destino es parte de su RedistList ( RedistList/FrameworkList.xml
).
Puede usar la reflexión para ver el editor del ensamblaje y coordinarlo con la ruta del conjunto. Si encuentra un ensamblado cuyo editor es Microsoft y existe en alguna parte debajo de C:/Windows/Microsoft.NET/Framework
, es una apuesta segura que es parte del tiempo de ejecución.
Pensándolo bien, el editor puede que ni siquiera sea necesario. Cualquier cosa bajo esa ruta debe ser parte del tiempo de ejecución (salvo una aplicación que se comporta mal que está bromeando donde no debería).
Sospecho que el método más confiable y más general será el PublicKeyToken. Sí, hay más de uno, pero va a ser una lista finita y una que no cambia muy a menudo.
En ese caso, podría tener una lista blanca de nombres de ensamblado; esa lista también será finita y estática entre las versiones del marco.