.NET リフレクションを使用してすべてのパラメーター/ローカル変数の値を取得する方法はありますか?
6 に答える
CLR デバッグ APIを使用してこの情報を取得できますが、単純な数行で抽出することはできません。
リフレクションは、スタックから情報を取得するために使用されません。それは議会を読みます。
StackTrace をご覧になることをお勧めします。
http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx
ここに良い記事があります:
http://www.codeproject.com/KB/trace/customtracelistener.aspx
リフレクションは、メソッドが持つパラメーターのタイプを教えてくれますが、特定の呼び出し中にそれらの値を発見するのには役立ちません。リフレクションは、ローカル変数については何も教えてくれません。
デバッガーがこの種の情報にアクセスするために使用する API の種類が必要です。
Secondlifeの人々はスクリプトを一時停止し、サーバー間で移動します。これは、呼び出しスタック上の変数の値を含め、実行中のスクリプトの状態をキャプチャする必要があることを意味します。
彼らのスクリプト言語は、.NETランタイムのオープンソース実装であるmonoで実行されます。彼らの解決策が通常の.NETランタイムに適用されるかどうかは疑問ですが、彼らがどのようにそれを行ったか(後半にスキップ)に関するプレゼンテーションのビデオはまだ興味深いかもしれません。
リフレクションを使用してそれがどのように可能かはわかりませんが、ウィービングの使用を見てください。SpringFramework.Net を使用すると、メソッド呼び出しをインターセプトできるポイントカットを定義できます。他の人もおそらくそうしています。
「BeforeAdvice」インターセプターへのリンクは次のとおりです http://www.springframework.net/docs/1.2.0-M1/reference/html/aop.html#d0e8139
これが可能だとは思いません。StackTrace を見ると、メソッドとそのパラメーターを取得できます。
System.Diagnostics.StackTrace sTrace = new System.Diagnostics.StackTrace(true);
for (Int32 frameCount = 0; frameCount < sTrace.FrameCount; frameCount++){
System.Diagnostics.StackFrame sFrame = sTrace.GetFrame(frameCount);
System.Reflection.MethodBase thisMethod = sFrame.GetMethod();
if (thisMethod == currentMethod){
if (frameCount + 1 <= sTrace.FrameCount){
System.Diagnostics.StackFrame prevFrame = sTrace.GetFrame(frameCount + 1);
System.Reflection.MethodBase prevMethod = prevFrame.GetMethod();
}
}
}