Pregunta

¿Cómo puedo saber por el nombre del ensamblado, o la clase de ensamblado (u otros similares), si un ensamblado es parte del .NETO marco (es decir, System.windows.Forms)?

Hasta ahora he considerado las propiedades PublicKeyToken y CodeBase, pero no siempre son las mismas para todo el marco.

La razón por la que quiero esta información es para obtener una lista de ensamblados que usa mi archivo EXE y que deben estar en las máquinas cliente, para poder 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 seleccionar 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 exista una propiedad IsFramework...:)

¿Fue útil?

Solución

Sospecho que el método más confiable y general será el PublicKeyToken.Sí, hay más de uno, pero será una lista finita y que no cambia muy a menudo.

De hecho, podría simplemente tener una lista blanca de nombres de ensamblados; esa lista también será finita y estática entre las versiones del marco.

Otros consejos

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í.

He tenido que lidiar con exactamente el mismo problema.Desafortunadamente, todas las respuestas dadas hasta ahora son insuficiente para determinar de forma segura si un ensamblado es parte de .NET Framework.

Microsoft pone una clase llamada FXAssembly en el espacio de nombres global de cada ensamblaje de marco con una cadena constante 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')

}

Utilice este "marcador" para comprobar si un ensamblaje es un ensamblaje de estructura.Verificar la clave pública tampoco hará daño.

No, no comienza con "Sistema".Puede consultar "WindowsBase", que es un ensamblaje de marco.

Tampoco puede verificar 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 manera de hacerlo es obtener una colección de marcos .NET instalados y verificar si el ensamblado de destino es parte de su RedistList (RedistList\FrameworkList.xml).

FrameworkList.xml se puede encontrar en:

  • .NET 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
  • .NET 3.x:C:\Archivos de programa (x86) eference Assemblies\Microsoft\Framework\vNúmero de versión\ListaRedist
  • .NET 4.x:C:\Archivos de programa (x86) eference Assemblies\Microsoft\Framework.NETFramework\vNúmero de versión\ListaRedist
  • Núcleo .NET:C:\Archivos de programa (x86) eference Assemblies\Microsoft\Framework.NETCore\vNúmero de versión\ListaRedist

Si sabe que ninguna de sus DLL estará en el GAC, puede verificar si cada ensamblado está en el GAC o no.Si es así, no lo copie.Si no es así, cópielo.Hay una propiedad en la clase Assembly llamada GlobalAssemblyCache.Obviamente, esto funcionaría mejor en algunas situaciones que en otras.

Cuando instala Visual Studio, obtiene los ensamblados de referencia en varias subcarpetas del formulario C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - lo más interesante podría ser el RedistList\FrameworkList.xml archivo que contiene una lista de todos los nombres de ensamblados que se enviaron con la versión del marco dada.

P.ej. 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 utilizar fácilmente estos archivos para establecer listas blancas estáticas de ensamblajes.

Podría utilizar la reflexión para mirar al editor del ensamblaje y coordinarlo con la ruta del ensamblaje.Si encuentra un ensamblado cuyo editor es Microsoft y que existe en algún lugar debajo C:\Windows\Microsoft.NET\Framework Es una apuesta segura que es parte del tiempo de ejecución.

Pensándolo bien, es posible que el editor ni siquiera sea necesario.Todo lo que se encuentre debajo de esa ruta debería ser parte del tiempo de ejecución (salvo una aplicación que se comporta mal y está manipulando donde no debería estar).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top