Я использую 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
документации для любого ключа, чтобы сделать это, так как это логическое место, чтобы иметь такую информацию, но с безрезультатно.
У кого-нибудь есть предложение?
добавление 'meth.DefineParameter (1, Re.ParameterAttributes.None," args ");' после определения meth сделал трюк. Спасибо AakashM. – Gorgen