3

私はReflection.Emitexeを作成するために使用しています。これで、機能する CIL PE を作成できるようになりました。(Console.WriteLine に文字列を出力するだけです。) ただし、main メソッドへの引数は自動生成 (A_0) されます。

.method public static void  Main(string[] A_0) cil managed
{
  .entrypoint
  // Code size       12 (0xc)
  .maxstack  1
  IL_0000:  nop
  IL_0001:  ldstr      "Cafe con pan"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  ret
} // end of method Program::Main

対応する C# プログラムのコードと比較してください。

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Cafe con pan"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

引数名は args です。引数に名前を付けるにはどうすればよいですか? メソッドを作成するために使用するコードは次のようになります。

Il = System.reflection.Emit
Re = System.Reflection
tb = Reflection.Emit.TypeBuilder

Il.MethodBuilder meth = tb.DefineMethod(
                "Main", // name
                Re.MethodAttributes.Public | Re.MethodAttributes.Static,
                // method attributes
                typeof(void),   // return type
                new Type[] { typeof(String[]) }); // parameter types

Il.ILGenerator methIL = meth.GetILGenerator();
methIL.Emit(Il.OpCodes.Nop);
methIL.Emit(Il.OpCodes.Ldstr, "Cafe con pan");
Type [] args = new Type []{typeof(string)};
Re.MethodInfo printString = typeof(Console).GetMethod("WriteLine", args);
methIL.Emit(Il.OpCodes.Call, printString);
methIL.Emit(Il.OpCodes.Ret);

TypeBuilder.DefineMethodそのような情報を持っているのは論理的な場所ですが、役に立たないので、それを行うための手がかりについてドキュメントを確認しまし た。
誰か提案がありますか?

4

1 に答える 1

4

MethodBuilder.DefineParameterパラメータ名を指定できるように見えます:

パラメータ属性と、このメソッドのパラメータまたはこのメソッドの戻り値の名前を設定します。カスタム属性の適用に使用できる ParameterBuilder を返します。

于 2012-05-17T11:03:56.680 に答える