2

.Netアプリケーションの実行時情報(どのメソッドが呼び出されているかなど)を監視する方法を誰かが知っているかどうか知りたいと思いました。

別の実行中のプロセスから特定のメソッドで実行する追加のコードを挿入します。

私は2つのアプリケーションを持っていると言います:

app1.exeは、簡単にするために

class Program
{
    static void Main(string[] args)
    {
      while(true){
        Somefunc();
      }
    }

    static void Somefunc()
    {
       Console.WriteLine("Hello World");
    }
} 

そして、アプリケーション1のSomefunc()が実行されていることを検出して、独自のコードを挿入できるようにしたい2番目のアプリケーションがあります。

 class Program
 {
     static void Main(string[] args)
     {
       while(true){
          if(App1.SomeFuncIsCalled)
             InjectCode();
         }
     }

    static void InjectCode()
    {
       App1.Console.WriteLine("Hello World Injected");
    }
 } 

したがって、結果はアプリケーション1に表示されます

Hello World
Hello World Injected 

私はそれがこれほど単純ではないことを理解しています(長い目で見れば)が、それが可能であるかどうか、そしてそれがどこから始めるべきかさえわかりません。

助言がありますか ?

私はJavaで同様のことが行われているのを見てきましたが、C#では決してありません。

編集:明確にするために、これの使用法は、私がソースコードにアクセスできない.Netベースのゲームにプラグインシステムを追加することです。

4

9 に答える 9

4

コードインジェクションについては、Mono.Cecilを調べる価値があるかもしれません。質問で説明したようにオンラインでは機能しませんが、オフラインで必要なことを実行できると思います(特定のメソッドを見つけてコードを追加し、変更したアセンブリを書き出すことができます)。 http://www.codeproject.com/KB/dotnet/MonoCecilChapter1.aspx

于 2009-07-22T17:46:49.133 に答える
2

Profiling APIを使用して、2番目のプログラムプロファイルを最初のプロファイルにする必要があります。その後、メソッド呼び出しの通知を受け取ることができます。

于 2009-07-22T16:40:05.073 に答える
2

ええと、App1の許可なしにそれをするのは難しいです。ただし、実際にApp1で拡張ポイントを作成したい場合は、ある種の拡張性フレームワークを使用して、提案していることを行うのは比較的簡単です。私は提案します:

私はMEFに精通しているので、次のようになります。

class Program
{
    [ImportMany("AddinContractName", typeof(IRunMe))]
    public IEnumerable<IRunMe> ThingsToRun { get; set; }

    void SomeFunc()
    {
        foreach(IRunMe thing in ThingsToRun)
        {
            thing.Run();
        }
        /* do whatever else ... */
    }
}
于 2009-07-22T16:45:14.140 に答える
1

コメントで明確にしたことで、ildasmとilasmを使用して逆アセンブルと再アセンブルを行う方がよいように思われます。

于 2009-07-22T16:39:56.307 に答える
1

もう1つのアイデアは、監視するexeを変更するアプリを作成することです。これは、プロファイリングツールがアプリを「計測」するときに行うのと同様のことを行います。基本的に、リフレクションを使用してアプリを参照し、次に.NETのEmit機能を使用して(別のファイル名で)exeを再作成し、同時にコードを挿入します。

もちろん、アプリが安全に処理を行おうとした場合、この新しいバージョンは他のアセンブリとの通信を許可されない可能性があります。

于 2009-07-22T16:52:42.690 に答える
0

作成者がアプリケーションをパッケージ化/構造化した方法によっては、自分のプロジェクトから自分のEXEファイルへの参照を追加し、自分のアプリケーション内から自分のコードを実行できる場合があります。それが機能する場合は、その時点でReflectionを使用して、プラグインできる便利なインターフェイス/イベントなどを取得するだけです(プライベートとマークされている場合は、直接使用してください:)。デバッグビルドまたはリリースビルドのデフォルト設定でビルドされたEXEへの参照を追加し、DLLと同じように使用できます。

それがうまくいかない場合は、メソッド呼び出しなどを交換するために使用できる高度なトリックがありますが、それはこの応答の範囲を超えています...最初に参照することを試すことをお勧めします。

于 2009-07-22T17:45:17.717 に答える
0

実行中のアプリにコードを挿入することが可能です。 これは実用的な例ですが、アンマネージdllへのインジェクションが含まれます。

于 2009-07-22T17:52:42.697 に答える
0

MonoCecilを使用してアセンブリにコードを挿入します

于 2009-07-22T18:42:25.700 に答える
0

CInjectを試して、C#またはVB.NETコードをアセンブリに挿入できます

于 2012-09-03T05:16:17.837 に答える