Pregunta

Es allí una manera de modificar la existente .NET asambleas sin necesidad de recurrir a la 3ª parte de las herramientas?Sé que PostSharp hace que esto sea posible, pero me parece muy derrochador que el developler de PostSharp básicamente había que reescribir la funcionalidad de todo el System.Reflection espacio de nombres con el fin de hacer las asambleas existentes modificables.

System.Reflection.Emit sólo permite la creación de nuevos, ensamblados dinámicos.Sin embargo, todas las clases del generador utilizado aquí heredar de la base de la reflexión de las clases (por ejemplo, TypeBuilder hereda de System.Type).Por desgracia, no parece ser una manera de obligar a una existente, cargado dinámicamente tipo en un tipo de generador.Al menos, no oficial, de forma compatible.

Entonces, ¿qué acerca de no admitidos?¿Alguien sabe de puertas traseras que permiten la carga de las asambleas existentes o tipos en el generador de clases?

La mente, yo soy no en la búsqueda de maneras de modificar la actual asamblea (este puede incluso una petición razonable), pero sólo para modificar las existentes ensamblados cargados desde el disco.Me temo que no hay tal cosa, pero me gustaría preguntar de todos modos.

En el peor de los casos, habría que recurrir a ildasm.exe para desensamblar el código y, a continuación, a ilasm.exe para volver a montar, pero no hay ningún conjunto de herramientas (leer:IL lector) que contiene .NET para trabajar con IL de datos (o no?).

/EDIT:

No tengo caso de uso específico.Estoy interesado en un propósito general solución, porque la aplicación de parches a las asambleas existentes es una tarea común.Tomar obfuscators por ejemplo, o los perfiladores, o AOP bibliotecas (sí, el último puede ser implementado de forma diferente).Como he dicho, parece increíblemente inútil ser obligado a reescribir gran parte de las infraestructuras ya existentes en System.Reflection.


@Cuña:

Estás en lo correcto.Sin embargo, no hay ningún caso de uso específico aquí.He modificado la pregunta original para reflejar esto.Mi interés se despertó por otra pregunta donde el autor de la pregunta, quería saber cómo podía inyectar las instrucciones pop y ret al final de cada método en el fin de mantener Lutz Roeder del Reflector de la reingeniería de las (VB o C#) código fuente.

Ahora, este escenario puede ser realizado con un número de herramientas, por ejemploPostSharp mencionados anteriormente y la Reflexil plugin para Reflector, que, a su vez, utiliza el Cecil biblioteca.

Con todo, yo no estoy satisfecho con el .NET framework.

@Joel:

Sí, soy consciente de esta limitación.Gracias de todos modos por señalarla, ya que es importante.

@marxidad:

Esto parece como el único enfoque posible.Sin embargo, esto significa que usted todavía tiene que volver a crear el conjunto completo utilizando el generador de clases, ¿verdad?I. e.tendrías que caminar sobre toda la asamblea de forma manual.

Hmm, voy a echarle un vistazo a eso.

¿Fue útil?

Solución

Puede utilizar MethodInfo.GetMethodBody().GetILAsByteArray(), modificar y, a continuación, conéctelo de nuevo en MethodBuilder.CreateMethodBody().

Otros consejos

Mono.Cecil también permite quitar el fuerte nombre de una asamblea y volver a guardarlo como un unsigned asamblea.Una vez que se retire el nombre fuerte de la asamblea, sólo se puede modificar la IL de su método objetivo y el uso de la asamblea, tal como lo haría con cualquier otra asamblea.Aquí está el enlace para quitar el nombre fuerte con Cecil:

http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

Una vez que haya quitado el nombre fuerte, usted puede hacer casi lo que quiera con la asamblea.¡A disfrutar!

Sería de gran ayuda si usted puede proporcionar un mayor caso de uso específico, probablemente hay mejores maneras para arreglar el problema de este.

En .NET 3.5 es posible añadir la extensión de los métodos existentes marco de las clases, tal vez eso es suficiente?

Un punto importante:si la asamblea es firmado, cualquier cambio va a fallar y que acabará con un fiasco.

.NET Framework asambleas están firmados y como Joel Coehoorn dijo que usted conseguirá un fiasco.

Usted podría cargar el ensamblado utilizando IronRuby, y mixin toda la funcionalidad que usted puede soñar

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