Frage

Lassen Sie uns sagen, dass ich einen Buggy Anwendung wie diese haben:

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

Die Anwendung ist bereits kompiliert und in die Wildnis im Einsatz. Jemand hat den Fehler gefunden, und jetzt sind sie auffordert, eine Lösung für sie. Während ich diese Anwendung mit dem Update erneut bereitstellen könnte, sein Extrem Ärger aus Gründen außerhalb meiner Kontrolle. - Ich will nur, anstatt einen Patch für den Bug schreiben

Insbesondere möchte ich meine eigenen MSIL in die säumige assmembly Quelldatei einzufügen. Ich habe noch nie etwas getan, und googeln hat keine nützlichen Informationen auftaucht. Wenn ich könnte nur ein Beispiel dafür, wie diese oben auf dem Code zu tun, würde es mir helfen enorm:)

Wie programmatisch ich meine eigenen MSIL in eine kompilierte .NET Assembly injizieren?

[Bearbeiten hinzuzufügen:] Die, die fragten: Ich habe keine Laufzeit Hotswapping benötigen. Seine völlig in Ordnung für mich die App geschlossen zu haben, manipulieren die Montage, dann starten Sie das Programm erneut aus.

[noch einmal bearbeiten:] Es sieht aus wie der allgemeine Konsens „Manipulation der Baugruppe ist ein schlecht Möglichkeit, ein Programm zu flicken“ wird. Ich werde nicht gehen diesen Weg, wenn es ein schlechte Idee .

Ich werde die Frage offen lassen, weil MSIL Injektion noch für andere Zwecke nützlich sein könnte:)

War es hilfreich?

Lösung

Ich denke, die Frage, die ich fragen würde, ist: „Wie würden Sie den Patch bereitstellen“? Irgendwo muss man etwas einsetzen, einen Fehler zu beheben, die bereits in der Wildnis ist. Warum sollte die DLL neu zu kompilieren und Loslassen die feste Version wirklich ein Problem sein? Meine Vermutung ist, dass herauszufinden, wie programmatisch MSIL injizieren wird mehr Ärger als einfach eine feste Montage Umschichtung.

Andere Tipps

Anstatt MSIL zur Laufzeit eingespritzt wird, haben Sie als die Quelle direkt in die Baugruppe eingefügt?

Sie können mit ildasm zerlegen, legen Sie die MSIL und dann mit ilasm wieder zusammenzusetzen, dann das Produkt aus, dass bereitstellen.

Wenn der Grund, warum Sie wollen nicht das ganze Zeug umschichten, weil es wirklich ein halbes Gig ist, sollten Sie wahrscheinlich eine Art von binären Patch-Tool verwenden - das ist das erste Ergebnis auf Google:

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

Wenn Ihr exe unterzeichnet wird dann wäre das nicht möglich sein. Warum können Sie nicht loslassen nur, dass einzelne Assembly, statt wieder die gesamte Anwendung Versand? Es scheint, wie Sie für eine komplexe Lösung für ein einfaches Problem Ziel.

Sie können statische MSIL Injection verwenden. Mono Cecil oder Postsharp vielleicht hilfreich.

gute Informationsquelle ...

IL Programmierung ebook

ein anderer ist MS Press-Buch auf IL-Programmierung.

Schritte IL zu dekompilieren und neu kompilieren

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

2. // ändern ConsoleApplication1.il Code

3. ilasm ConsoleApplication1.il

Sie müssen nicht verwalteten Code dies erfolgreich durchzuführen, aber es kann getan werden ...

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top