2016-10-30 4 views
0

私は別のクラスにあるかのようにメソッドをコンパイルできる何かを探していますので、手動で変更することなく内部フィールドと型を使うメソッドを注入できますオペランドの値。メソッドを別のクラスの一部であるかのようにコンパイルします

例えば

私たちは、デバッグのための値を取得する必要がある場合:

class bla{ 
internal string importantValue; 
... 
public void onInitialize(){ 
    ... 
    //this is where the compiler should be made to think it is 
} 
} 

とコンパイラ

public void onInitialize(){ //code to be compiled as if it were in that method 
    File.WriteAllText("usefulString.txt",importantValue.toString()); 
} 

に入り、その後、私たちはコンパイル出力のILを得ることができ、コードとbla.onInitializeに挿入して、値を取得できるようにします。

+0

'partial'クラスにオプションを使用していますか? – Benj

+0

あなたは、任意のビットをどのように取って、そのアセンブリ内のクラスのメンバーとして別々のプリコンパイルされたアセンブリに挿入するかを尋ねていますか? – Abion47

+0

@ eim64私はあなたが必要とするものを正確に理解していません。あなたはそれを説明しようとすることはできますか?はいの場合、私はあなたを助けることができると確信しています。あなたは 'class'の内部メンバーを読むことができるメソッドを生成する必要がありますか? –

答えて

0

この例では、onInitialize()をprotectedに設定すると、別のクラスでオーバーライドを構築すると動作します。

また、メソッドの本体をクラスレベルで定義されたデリゲートにしてから、コード内に別のデリゲートを設定して別のことを行わせます。

+0

すべてのメソッドとフィールドを取得できるものを探しています – eim64

+0

Fakesというテスト手法を使用して、意図したコードを任意に変更して何か他のことをさせたいと考えています。これは通常、単体テストを可能にするコードを分離するために使用されます。詳しくはMicrosoft Fakesを参照してください。 – PhillipH

0

私は本当にあなたが欲しいものを手に入れていないし、もっと簡単な方法があると思う。

あなたの質問タイトルからわかると、クラスbla(たとえば)をコンパイルしたいのですが、メソッドonInitializeにコンパイル時に新しいコードが追加されるようにしたいとします。本当ですか?

これにはいくつかの方法があります。私はそれらの2つを説明します。

  1. StaticProxy.Fodyのようなライブラリを使用できます。このlibは、メソッドをインターセプトし、必要に応じてメソッドを挿入できるようにします。したがって、あなたの例では、onInitializeメソッドを傍受し、このコードをFile.WriteAllText("usefulString.txt",importantValue.toString()); に追加します。これはすべてコンパイル時に行います。コードをコンパイルした後、出力されたdllにはこの注入されたコードが含まれます。

  2. 2番目のオプションはregularyあなたのコードをコンパイルし、その後、あなたのコンパイルしたDLLを読み込んで(この例では、onInitializeFile.WriteAllText etc.を追加)、あなたがしたい場所にしたいものは何でも追加するコードを記述するMono.Cecilを使用することができた後でこのdllを保存すると、新しい注入コードが格納されます。

両方のオプションは、静的な方法でコードを追加する簡単な方法です(実行時ではなくコンパイル時)。

関連する問題