在方法参数上设置名称

时间:2012-05-17 10:57:25

标签: c# reflection.emit

我正在使用Reflection.Emit制作一个exe。到目前为止,我已经可以创建一个可用的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文档是否有任何线索,因为这是获得此类信息但无济于事的合理位置。
有没有人有建议?

1 个答案:

答案 0 :(得分:4)

看起来MethodBuilder.DefineParameter允许您指定参数名称:

  

设置此方法的参数的参数属性和名称,或此方法的返回值。返回可用于应用自定义属性的ParameterBuilder。