2012-05-17 1 views
3

Я использую Reflection.Emit, чтобы сделать exe. Я пришел так далеко, что могу создать рабочий CIL PE. (Он просто выводит строку в Console.WriteLine.) Но аргумент основного метода автоматически генерируется (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 

название аргумента арг. Как я могу назвать имя аргумента? кода я использую для создания методы выглядит следующим образом:

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

Похоже MethodBuilder.DefineParameter позволяет указать имена параметров:

Устанавливает параметр атрибутов и имя параметра этого метода или возвращаемого значения этого метода. Возвращает параметр ParameterBuilder, который может использоваться для применения пользовательских атрибутов.

+1

добавление 'meth.DefineParameter (1, Re.ParameterAttributes.None," args ");' после определения meth сделал трюк. Спасибо AakashM. – Gorgen