7

次のようなバグのあるアプリケーションがあるとします。

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

アプリケーションはすでにコンパイルされ、実際にデプロイされています。誰かがバグを発見し、修正を要求しています。このアプリケーションを修正して再デプロイすることはできますが、私の制御の及ばない理由で非常に面倒です。代わりに、バグのパッチを書きたいだけです。

具体的には、問題のあるアセンブリ ソース ファイルに独自の MSIL を挿入したいと考えています。私はこれまでにこのようなことをしたことがなく、グーグルで調べても有益な情報は得られませんでした。上記のコードでこれを行う方法のサンプルを見ることができれば、非常に役立ちます:)

コンパイル済みの .NET アセンブリに独自の MSIL をプログラムで挿入するにはどうすればよいですか?

[編集して追加:] 質問者へ: ランタイムのホットスワップは必要ありません。アプリを閉じて、アセンブリを操作してから、プログラムを再起動しても問題ありません。

[もう一度編集:] 一般的なコンセンサスは、「アセンブリを操作することは、プログラムにパッチを適用するための悪い方法である」ということのようです。それが悪い考えなら、私はその道をたどりません。

MSIL インジェクションは他の目的にも役立つ可能性があるため、質問を開いたままにします:)

4

7 に答える 7

5

私が尋ねる質問は、「パッチをどのように展開しますか?」ということだと思います。どこかで、すでに出回っているバグを修正するために何かを展開する必要があります。dll を再コンパイルして修正済みバージョンをリリースすることが実際に問題になるのはなぜですか? 私の推測では、MSIL をプログラムで挿入する方法を理解することは、修正されたアセンブリを単純に再デプロイするよりも困難になると思います。

于 2009-02-04T18:43:44.007 に答える
4

実行時に MSIL を挿入するのではなく、ソースをアセンブリに直接挿入することを検討しましたか?

ildasm で逆アセンブルし、MSIL を挿入してから、ilasm で再アセンブルし、その製品を展開できます。

于 2009-02-04T18:40:39.803 に答える
3

全体を再デプロイしたくない理由が実際には半分のギグである場合は、何らかのバイナリ パッチ ツールを使用する必要があります。これが Google での最初の結果です。

バイナリ差分 http://www.daemonology.net/bsdiff/

于 2009-02-04T18:50:20.000 に答える
2

良い情報源...

ILプログラミング電子ブック

もう1つは、ILプログラミングに関するMSPressの本です。

ILに逆コンパイルして再コンパイルする手順

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

2.//ConsoleApplication1.ilコードを変更します

3. ilasm ConsoleApplication1.il

于 2009-06-09T22:39:46.867 に答える
1

これを正常に実行するには、アンマネージコードが必要ですが、実行できます...

http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-timeを参照してください

于 2012-12-13T03:21:52.927 に答える
1

あなたのexeが署名されている場合、それは不可能です。アプリケーション全体を再度出荷するのではなく、その単一のアセンブリをリリースできないのはなぜですか? 単純な問題の複雑な解決策を目指しているようです。

于 2009-02-04T18:56:38.897 に答える
1

静的 MSIL インジェクションを使用できます。Mono Cecil または PostSharp が役立つかもしれません。

于 2009-02-04T19:14:48.000 に答える