Pregunta

Vamos a decir que tengo una aplicación con errores como esto:

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 se compila y se despliega en la naturaleza. Alguien ha encontrado el error, y ahora están solicitando una solución para ello. Mientras que pude volver a implementar esta aplicación con la corrección, su una molestia extrema por razones fuera de mi control -. Yo sólo quiero escribir un parche para el error en lugar

En concreto, quiero insertar mi propio MSIL en el infractor assmembly archivo de origen. Nunca he hecho nada como esto antes, y buscando en Google no ha aparecido 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 enormemente a cabo:)

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

[Editar para añadir:] Para aquellos que pregunté: No necesito hotswapping tiempo de ejecución. Su perfectamente bien para mí tener la aplicación cerrada, manipular la asamblea, a continuación, reinicie el programa de nuevo.

[Editar una vez más:] Parece que el consenso general es "manipulando la asamblea es una mala manera para parchear un programa". No voy a entrar en ese camino si es un mala idea .

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

¿Fue útil?

Solución

Creo que la pregunta que haría es "¿cómo distribuir el parche"? En algún lugar, tiene que implementar algo para corregir un error que ya se encuentra en la naturaleza. ¿Por qué sería volver a compilar el archivo DLL y la liberación de la versión fija realmente ser un problema? Mi conjetura es que encontrar la manera de inyectar programáticamente MSIL va a ser más problema que simplemente volver a desplegar un conjunto fijo.

Otros consejos

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, a continuación, desplegar el producto de ello.

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:

binario Dif http://www.daemonology.net/bsdiff/

Si su exe está firmado, eso no sería posible. ¿Por qué no puede simplemente liberar ese solo conjunto, en lugar de enviar toda la aplicación de nuevo? Parece que usted está apuntando para una solución compleja para un problema sencillo.

Puede utilizar inyección MSIL estática. Cecil mono o tal vez PostSharp útiles.

buena fuente de información ...

IL Programación ebook

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

pasos de descompilar a IL y recompilar

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

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

3. ilasm ConsoleApplication1.il

Necesitará el código no administrado para realizar esto con éxito, pero se puede hacer ...

http: / /www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time

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