8

私は考えていた...

私がこのようなコードを持っているとき:

lock (obj)
{
    MyCode.MyAgent();
}

ブロックの下で実行されていることを認識するMyAgentコードを含めることができますか?lock

どうですか:

for (int i=0;i<5;i++)
{
   MyCode.MyAgent();
}

ブロックの下で実行されていることを認識するMyAgentコードを含めることができますか?loop

usingブロックやコードなどについても同じ質問をすることができます...-unsafeよくわかります...

これはC#で可能ですか?

これは単なる理論上の質問であり、私は何も達成しようとはしていません...ただの知識です。

4

3 に答える 3

8

完全に不可能というわけではありません。StackTraceクラスを使用して呼び出し元メソッドへの参照を取得し、MethodInfo.GetMethodBody()を使用してそのメソッドのILを取得できます。

しかし、これほど信頼できるものは得られません。ジャストインタイムコンパイラのオプティマイザを使用すると、呼び出しがどこにあるかを正確に把握するのに非常に苦労します。メソッド本体のインライン化により、メソッドが完全に非表示になります。ループを展開すると、ループインデックスについてのアイデアを得ることができなくなります。オプティマイザはCPUレジスタを使用してローカル変数とメソッド引数を格納するため、信頼できる変数値を取得できません。

ILの逆コンパイルに伴うスズ箔の咀嚼努力は言うまでもありません。これはどれも、メソッドに引数を渡すだけの単純さと速度に近いものではありません。

于 2012-07-07T12:40:33.480 に答える
3

いいえ(もちろん、この情報をメソッドに明示的に転送するコードを禁止します)。

この理由は、これらのような概念は、ILまたはメタデータのいずれかに保存される構造化された情報に変換されず、CLRが実行時に公開する可能性があるためです。これをメタデータにエンコードされるクラスと比較して、実行時にリフレクションを有効にします。

この情報を保持しようとすると、複雑さが増し、もちろん、プログラムでこのような状態を維持する必要がある場合にコードでこれを実装するのは簡単なので、実際には何のメリットもない追加のオーバーヘッドが発生します(この状態を要求するのが良い考えかどうかは別の問題です) 。

于 2012-07-07T12:38:53.520 に答える
0

StackFrameを使用して現在の呼び出しスタックを取得し、リフレクションを使用してメソッド本体などを分析することでその情報を取得できる可能性がありますが、.NETが直接記述した機能をサポートしているとは思いませんが、よくわかりません。あなたがこれまでにどれほど正確であることができるか。

.NETには同期用のコンテキストがありますが、要求しているレベルではありません。たとえば、System.ContextBoundObjectを確認してください。

于 2012-07-07T12:43:26.800 に答える