2009-08-31 10 views
13

プログラム(VS2008)をデバッグしていて、コード行をステップ実行していました。私はデリゲート関数が呼び出されている1行に出くわしました。しかし、私が期待したようにメソッドにステップインするのではなく、メソッドはバイパスされました。代わりにデバッガがデリゲートによって呼び出される関数であると仮定してステップしました。コールスタックでは、デリゲートメソッドが期待される行は、テキスト[Lightweight Function]でグレー表示されます。コールスタックの[[Lightweight Function]]

「軽量機能」の意味は何ですか?この機能を使用する方法はありますか?

+16

最初のVisual Studioでは、「このコードはツールによって生成されました」と表示され、現在は「軽量」の関数を呼び出しています。どのような態度! :) –

+0

コンパイル設定を確認してください。最適化が有効になっていて、関数が最適化されている(インライン展開されている) – CodingBarfield

答えて

12

私は、軽量関数がDynamicMethodを参照していると考えています。つまり、実行時に放出され、使用され、アンロードされます。

このブログの記事はIron Pythonに関連していますが、情報は.NETプロジェクトにとっては良いはずです:Viewing Emitted IL。著者は、これらの「軽量関数」を見るために、より低いレベルのデバッガ(windbg.exe)を使用する方法を示します。

3

DynamicMethodのようになります。いくつかの洞察については、thisを参照してください。

しかし、私は動的な方法にステップアップについてはよく分かりません。

2

DynamicMethodためのコールスタック(両方のデバッグおよびモードを解除):

[Lightweight Function] 
[Native to Managed Transition] 
mscorlib.dll!System.Reflection.Emit.DynamicMethod.Invoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture) + 0x199 bytes 

純粋

[軽量機能】動的方法にデリゲートである場合

フレームを観察することができますと呼ばれる。