如何使用Mono.Cecil创建HelloWorld.exe

问题描述:

如何使用Mono.Cecil从头创建一个简单的程序?到目前为止,我所能找到的所有示例和教程都假设您正在使用现有程序集,阅读或进行小改动。如何使用Mono.Cecil创建HelloWorld.exe

请看下面的代码,让你开始:

var myHelloWorldApp = AssemblyDefinition.CreateAssembly(
    new AssemblyNameDefinition("HelloWorld", new Version(1, 0, 0, 0)), "HelloWorld", ModuleKind.Console); 

var module = myHelloWorldApp.MainModule; 

// create the program type and add it to the module 
var programType = new TypeDefinition("HelloWorld", "Program", 
    Mono.Cecil.TypeAttributes.Class | Mono.Cecil.TypeAttributes.Public, module.TypeSystem.Object); 

module.Types.Add(programType); 

// add an empty constructor 
var ctor = new MethodDefinition(".ctor", Mono.Cecil.MethodAttributes.Public | Mono.Cecil.MethodAttributes.HideBySig 
    | Mono.Cecil.MethodAttributes.SpecialName | Mono.Cecil.MethodAttributes.RTSpecialName, module.TypeSystem.Void); 

// create the constructor's method body 
var il = ctor.Body.GetILProcessor(); 

il.Append(il.Create(OpCodes.Ldarg_0)); 

// call the base constructor 
il.Append(il.Create(OpCodes.Call, module.Import(typeof(object).GetConstructor(Array.Empty<Type>())))); 

il.Append(il.Create(OpCodes.Nop)); 
il.Append(il.Create(OpCodes.Ret)); 

programType.Methods.Add(ctor); 

// define the 'Main' method and add it to 'Program' 
var mainMethod = new MethodDefinition("Main", 
    Mono.Cecil.MethodAttributes.Public | Mono.Cecil.MethodAttributes.Static, module.TypeSystem.Void); 

programType.Methods.Add(mainMethod); 

// add the 'args' parameter 
var argsParameter = new ParameterDefinition("args", 
    Mono.Cecil.ParameterAttributes.None, module.Import(typeof(string[]))); 

mainMethod.Parameters.Add(argsParameter); 

// create the method body 
il = mainMethod.Body.GetILProcessor(); 

il.Append(il.Create(OpCodes.Nop)); 
il.Append(il.Create(OpCodes.Ldstr, "Hello World")); 

var writeLineMethod = il.Create(OpCodes.Call, 
    module.Import(typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }))); 

// call the method 
il.Append(writeLineMethod); 

il.Append(il.Create(OpCodes.Nop)); 
il.Append(il.Create(OpCodes.Ret)); 

// set the entry point and save the module 
myHelloWorldApp.EntryPoint = mainMethod; 
myHelloWorldApp.Write("HelloWorld.exe"); 

我在这里没有笔记本电脑(我在街上行走),所以我不能写和展示给你一个完整的例子,但它很简单,就像你已经看到的其他例子。但是你需要创建一个并保存它的文件。

您需要创建一个AssemblyDefinition,一个ModuleDefinition,一个类型和方法并将其保存到磁盘。

你需要记住它的IL和元数据编写器没有编译器。例如,

检查this