que descargar c# .net assemblies

que - assembly c# descargar



¿Cómo creo y uso un ''Ensamblaje de referencia'' solo para metadatos.NET? (4)

Desde la versión 3.0, .NET instala un conjunto de ''ensamblajes de referencia'' diferentes en C: / Archivos de programa / Referencias / Microsoft ...., para admitir diferentes perfiles (por ejemplo, perfil de cliente .NET 3.5, perfil de Silverlight). Cada uno de estos es un conjunto .NET adecuado que contiene solo metadatos, sin código IL, y cada conjunto está marcado con el ReferenceAssemblyAttribute ensamblaje. Los metadatos están restringidos a aquellos tipos y miembros disponibles bajo el perfil aplicable; así es como intellisense muestra un conjunto restringido de tipos y miembros. Los ensamblajes de referencia no se utilizan en tiempo de ejecución.

Aprendí un poco sobre esto en esta publicación de blog .

Me gustaría crear y usar un conjunto de referencia para mi biblioteca.

  1. ¿Cómo creo un conjunto de solo metadatos? ¿Hay algún indicador de compilador o ildasm postprocesador?
  2. ¿Hay atributos que controlan qué tipos se exportan a diferentes ''perfiles''?
  3. ¿Cómo funciona la resolución del ensamblaje de referencia en el tiempo de ejecución? Si tuviera el ensamblaje de referencia presente en el directorio de mi aplicación en lugar del ensamblaje ''real'', y no en el GAC, continuaría el sondeo y mi evento AssemblyResolve se dispararía para que pueda suministrar montaje real en tiempo de ejecución?

Cualquier idea o sugerencia sobre dónde podría aprender más sobre esto sería muy apreciada.

Actualización: Mirando un poco alrededor, veo que los ''ensamblajes de referencia'' de .NET 3.0 parecen tener algo de código, y el atributo Ensamblaje de referencia solo se agregó en .NET 4.0. Así que el comportamiento podría haber cambiado un poco con el nuevo tiempo de ejecución.

¿Por qué? Para mi biblioteca de complementos de Excel-DNA ( http://exceldna.codeplex.com ), creo un complemento .xll de un solo archivo empaquetando los ensamblados a los que se hace referencia en el archivo .xll como recursos. Los ensamblajes empaquetados incluyen el código de complemento del usuario, así como la biblioteca administrada de Excel-DNA (a la que puede hacer referencia el ensamblado del usuario).

Suena bastante complicado, pero funciona maravillosamente bien la mayor parte del tiempo: el complemento es un archivo pequeño y sencillo, por lo que no hay problemas de instalación de distribución. Me encuentro con problemas (no inesperados) debido a las diferentes versiones: si hay una versión antigua de la biblioteca administrada de Excel-DNA como un archivo, el tiempo de ejecución cargará ese archivo en lugar del empaquetado (nunca tengo la oportunidad de interferir con el cargando).

Espero hacer un ensamblaje de referencia para mi parte gestionada de Excel-DNA que los usuarios puedan señalar al compilar sus complementos. Pero si erróneamente tienen una versión de este ensamblaje en tiempo de ejecución, el tiempo de ejecución debería fallar en cargarlo y darme la oportunidad de cargar el ensamblaje real desde los recursos.


Es posible que tengas suerte con la Biblioteca Cecil (de Mono); Creo que la implementación permite la funcionalidad de ILMerge, podría escribir conjuntos solo de metadatos.

He escaneado el código base (la documentación es escasa), pero aún no he encontrado ninguna pista obvia ...

YYMV


Para crear un ensamblaje de referencia, debe agregar esta línea a su archivo AssemblyInfo.cs :

[assembly: ReferenceAssembly]

Para cargar otros, puede hacer referencia a ellos como de costumbre a partir de las referencias de su proyecto de VisualStudio, o dinámicamente en tiempo de ejecución utilizando:

Assembly.ReflectionOnlyLoad()

o

Assembly.ReflectionOnlyLoadFrom()

Si ha agregado una referencia a un conjunto de metadatos / referencia utilizando VisualStudio, entonces intellisense y la construcción de su proyecto funcionarán bien, sin embargo, si intenta ejecutar su aplicación contra una, obtendrá un error:

System.BadImageFormatException: No se puede cargar un conjunto de referencia para su ejecución.

Por lo tanto, la expectativa es que en tiempo de ejecución se sustituya en un ensamblaje real que tenga la misma firma de metadatos.

Si ha cargado un ensamblaje dinámicamente con Assembly.ReflectionOnlyLoad() , solo puede realizar todas las operaciones de reflexión en su contra (lea los tipos, métodos, propiedades, atributos, etc., pero no puede invocar dinámicamente ninguno de ellos).

Tengo curiosidad por saber cuál es su caso de uso para crear un conjunto de solo metadatos. Nunca he tenido que hacer eso antes, y me encantaría saber si has encontrado algún uso interesante para ellos ...


Sí, esto es nuevo para .NET 4.0. Estoy bastante seguro de que esto se hizo para evitar los problemas de versiones desagradables en los paquetes de servicio .NET 2.0. El mejor ejemplo es la sobrecarga WaitHandle.WaitOne (int), agregada y documentada en SP2. Una sobrecarga popular porque evita tener que adivinar el valor correcto para * exitContext "en la sobrecarga de WaitOne (int, bool). El problema es que el programa se dispara cuando se ejecuta en una versión 2.0 que es más antigua que SP2. diagnóstico. El aislamiento de los ensamblajes de referencia garantiza que esto no pueda volver a suceder.

Creo que esos ensamblajes de referencia se crearon partiendo de una copia de los ensamblados compilados (como se hizo en versiones anteriores) y ejecutándolos a través de una herramienta que elimina el IL del ensamblaje. Sin embargo, esa herramienta no está disponible para nosotros, no hay nada en el subdirectorio SDK de las herramientas bin / netfx 4.0 de Windows 7.1 que pueda hacer esto. No es exactamente una herramienta que se usa con frecuencia, por lo que probablemente no sea de calidad de producción :)


Si aún está interesado en esta posibilidad, he creado una bifurcación del proyecto il-repack basado en Mono.Cecil que acepta un argumento de línea de comando "/ meta" para generar un ensamblado de metadatos solo para el público y los tipos protegidos.

https://github.com/KarimLUCCIN/il-repack/tree/xna

(Lo probé en el completo marco XNA y su trabajo afaik ...)