Domanda

Diciamo che ho un'applicazione buggy in questo modo:

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!
        }
    }
}

L'applicazione è già compilato e distribuito in libertà. Qualcuno ha trovato il bug, e ora stanno chiedendo una correzione per esso. Mentre ho potuto ri-distribuire questa applicazione con la correzione, il suo un fastidio estremo per motivi al di fuori del mio controllo -. Voglio solo scrivere una patch per il bug invece

In particolare, voglio inserire la mia MSIL nel incriminato assmembly file sorgente. Non ho mai fatto niente di simile prima, e googling non ha alzato tutte le informazioni utili. Se solo potessi vedere un esempio di come fare questo sul codice di cui sopra, sarebbe aiutarmi moltissimo:)

Come faccio a livello di codice iniettare la mia MSIL in un assembly .NET compilato?

[Modifica per aggiungere:] a chi gli chiedeva: Non ho bisogno di runtime hotswapping. Il suo perfettamente bene per me avere l'applicazione chiusa, manipolare l'assemblea, quindi riavviare nuovamente il programma.

[Modifica ancora una volta:] Sembra che il consenso generale è "manipolando l'assemblaggio è un male modo per rattoppare un programma". Non voglio andare su questa strada se un cattiva idea .

Lascio aperta la questione, perché l'iniezione MSIL potrebbe ancora essere utile per altri scopi:)

È stato utile?

Soluzione

Credo che la domanda che vorrei porre è "come è possibile distribuire la patch"? Da qualche parte, è necessario distribuire qualcosa per correggere un bug che è già fuori nel selvaggio. Perché avrebbe ricompilare il dll e rilasciando la versione fissa davvero essere un problema? La mia ipotesi è che per capire come iniettare programatically MSIL sta per essere più problemi di una semplice ridistribuzione un'assemblea fisso.

Altri suggerimenti

Piuttosto che iniettando MSIL in fase di esecuzione, avete considerato l'inserimento della fonte direttamente nel montaggio?

È possibile smontare con ildasm, inserire il MSIL, e poi rimontare con ilasm, quindi distribuire il prodotto di questo.

Se la ragione per cui non si vuole ridistribuire la roba insieme è perché è davvero mezzo un concerto, probabilmente si dovrebbe utilizzare una sorta di strumento di patch binarie - che è il primo risultato su Google:

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

Se il vostro exe è firmato quindi che non sarebbe stato possibile. Perché non si può solo rilasciare quel singolo assemblaggio, invece di spedizione di nuovo l'intera applicazione? Sembra che si sta puntando per una soluzione complessa per un semplice problema.

È possibile utilizzare statica iniezione MSIL. Mono Cecil o PostSharp forse utile.

buona fonte di informazioni ...

IL programmazione ebook

un altro è MS Press libro sulla programmazione IL.

passi per decompilare a IL e ricompilare

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

2. // modificare il codice ConsoleApplication1.il

3. ilasm ConsoleApplication1.il

Sarà necessario il codice non gestito per eseguire questo successo, ma si può fare ...

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top