6

System.Reflection.Emit.LocalBuilderクラスのドキュメントページに表示されるサンプルコードを実行しようとしましたLocalBuilder.SetLocalSymInfo(string, int, int)が、IL DissasemblerがSampleAssembly.dllのILとしてこれを示しているため、への呼び出しは何もしていないようです。

.method public static string  Function1(int32 A_0) cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init (string V_0,
           int32 V_1)
  IL_0000:  ldarg.0
  IL_0001:  stloc.1
  IL_0002:  ldstr      "string value"
  IL_0007:  stloc.0
  IL_0008:  ldloc.0
  IL_0009:  ret
} // end of method Example::Function1

変数名(myStringおよびmyInt)がDissasemblerにリストされていないのはなぜですか?

環境情報:

  • Windows764ビット
  • Visual Studio 2010 Professional SP1
  • .Net 4.0.30319 SP1
  • ターゲットフレームワーク:.Net4クライアントプロファイル
  • デバッグ構成(System.Reflection.Emitを使用するプログラムの場合)

編集:コメントで述べたように、SampleAssembly.dllファイルと一緒に生成されているSampleAssembly.pdbファイルがあります。

4

3 に答える 3

5

System.Reflection.Emitのデバッグサポートはかなり貧弱で風変わりです(これはIKVM.Reflectionにもある程度当てはまります。これは、基盤となる.pdbライターAPIから壊れた部分を継承しているためです。 .pdbファイル形式は文書化されていません)。

とにかく、サンプルが機能しない理由は、次のコードが欠落しているためです。

ISymbolDocumentWriter doc = myModule.DefineDocument("sourcefile", Guid.Empty, Guid.Empty, Guid.Empty);

myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0);

メソッドには少なくとも1つのシーケンスポイントが必要です。これは、内部データ構造が相互に関連付けられる方法だからです。

于 2013-02-05T16:03:39.607 に答える
2

シンボル名は、アセンブリではなくPDBファイルに保存されます。

Reflector.NETのようなツールは、逆アセンブルされたコードに適切な名前を付けるために、存在する場合はPDBファイルをロードします。

これは、PDBファイルがある場合とない場合のデバッガーでコードをデバッグすることによっても確認できます。

于 2013-02-05T10:34:56.563 に答える
1

これは、モジュールをリリースDLLとしてビルドしているためだと思います。

true2番目のパラメータとしてに渡してみてくださいAssemblyBuilder.DefineDynamicModule

于 2012-02-13T11:46:39.600 に答える