2009-02-04 29 views
7

Digamos que tengo una aplicación con errores como este:programático MSIL inyección

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("2 + 1 = {0}", Add(2, 1)); 
     } 

     static int Add(int x, int y) 
     { 
      return x + x; // <-- oops! 
     } 
    } 
} 

La aplicación ya está compilado y desplegado en el medio natural. Alguien ha encontrado el error y ahora están solicitando una solución. Si bien pude volver a implementar esta aplicación con la solución, es una molestia extrema por razones fuera de mi control. Solo quiero escribir un parche para el error.

Específicamente, quiero insertar mi propio MSIL en el archivo de origen assenmbly ofensivo. Nunca he hecho algo como esto antes, y Google no ha encontrado ninguna información útil. Si tan sólo pudiera ver una muestra de cómo hacer esto en el código anterior, me ayudaría a tremendamente :)

¿Cómo mediante programación inyecto mi propia MSIL en un ensamblado de .NET compilado?

[Editar para agregar:] A los que preguntaron: No necesito hotswapping en tiempo de ejecución. Está perfectamente bien para mí cerrar la aplicación, manipular el ensamblaje y luego reiniciar el programa nuevamente.

[Editar una vez más:] Parece que el consenso general es "manipular el conjunto es una forma mala para parchear un programa". No iré por ese camino si es un bad idea.

Voy a dejar la pregunta abierta, porque la inyección MSIL aún podría ser útil para otros fines :)

+0

¿quieres hacer esto mientras la aplicación se está ejecutando o cuando su fuera de línea? – Peter

+0

En caso de que se pregunte por qué no solo volvería a implementar mi aplicación, el software que estoy escribiendo consta de medio concierto de archivos ex y dlls, y solo se lanza una o dos veces al año. Implementar la aplicación es un gran proceso. Los parches y las revisiones nos permitirán neutralizar errores entre implementaciones con mayor frecuencia. – Juliet

+0

¿Medio concierto? ¡Wow eso es mucho! –

Respuesta

5

Supongo que la pregunta que me haría es "¿cómo desplegaría el parche"? En algún lugar, tienes que implementar algo para arreglar un error que ya está en libertad. ¿Por qué volver a compilar el dll y liberar la versión fija realmente sería un problema? Supongo que descubrir cómo inyectar MSIL de forma programática va a ser más problemas que simplemente volver a implementar un ensamblaje fijo.

+0

Así es como hacemos las cosas ahora, y es un gran PITA. Algunos clientes están utilizando las versiones anteriores del programa, algunas de las DLL están firmadas, algunas son muy grandes y todas están vinculadas entre sí. Me encontré con muchos bloques de ladrillos, más de lo que puedo explicar en este comentario, intercambiando archivos DLL. – Juliet

+0

Si el intercambio de archivos DLL es difícil, ¿cómo espera inyectar código en ellos? –

+0

Todavía no entiendo por qué solucionar el error en el código fuente y volver a compilar solo este ensamblado sería un problema. Ni que decir tiene que no debe romper interfaces y dejar el número de versión sin incriminar. –

4

En lugar de la inyección de MSIL en tiempo de ejecución, ¿ha considerado la inserción de la fuente directamente en la asamblea?

Puede desmontar con ildasm, insertar su MSIL, y luego volver a montar con ilasm, luego desplegar el producto de eso.

+1

Este es el tipo de soluciones que las personas amor para mantener. – erikkallen

+0

-1: Esto sería imposible de mantener. –

+3

¿Y inyectar MSIL en un proceso en ejecución es de alguna manera más fácil? – TheSmurf

3

Si la razón por la que no quiero volver a implementar toda la materia es porque es realmente la mitad de un concierto, probablemente debería utilizar algún tipo de herramienta de parche binario - que es el primer resultado en Google:

Binary Diff http://www.daemonology.net/bsdiff/

2

Si su exe está firmado, entonces eso no sería posible. ¿Por qué no puede simplemente lanzar ese ensamblaje único, en lugar de enviar toda la aplicación nuevamente? Parece que estás buscando una solución compleja para un problema simple.

1

Puede utilizar la inyección MSIL estática. Mono Cecil o PostSharp pueden ser útiles.

1

buena fuente de información ...

IL Programming ebook

otro es Microsoft Press libro sobre la programación IL.

pasos de descompilar a IL y recompilar

1. ildasm/salida = ConsoleApplication1.il ConsoleApplication1.exe

2. // modificar el código ConsoleApplication1.il

3. ilasm ConsoleApplication1.il