Почему бы просто не использовать API Reflection.Emit , чтобы создать сборку в памяти с откомпилированным кодом и затем сохранить ее на диск? Должно быть намного проще, чем писать файлы .IL.
Ссылки:
Если вы хотите пойти по этому пути, если вы зададите здесь более конкретные вопросы по SO , вы получите множество примеров того, как определить динамическую сборку и сохранить ее на диск.
Вот пример:
using System;
using System.Reflection.Emit;
using System.Reflection;
namespace SO2598958
{
class Program
{
static void Main()
{
AssemblyBuilder asm = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("TestOutput"),
AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mod = asm.DefineDynamicModule("TestOutput.exe",
"TestOutput.exe");
TypeBuilder type = mod.DefineType("Program", TypeAttributes.Class);
MethodBuilder main = type.DefineMethod("Main",
MethodAttributes.Public | MethodAttributes.Static);
ILGenerator il = main.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello world!");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
BindingFlags.Public | BindingFlags.Static,
null, new Type[] { typeof(String) }, null));
il.Emit(OpCodes.Ret);
type.CreateType();
asm.SetEntryPoint(main);
asm.Save("TestOutput.exe");
}
}
}
Файл с тестовым решением можно скачать здесь . Прямая ссылка на zip-файл с решением здесь .
Если вы сначала скомпилируете и запустите эту программу, она создаст новый exe-файл на диске с именем TestOutput, который вы затем сможете выполнить, чтобы получить «Hello World!» напечатано на консоли.