如何使用Mono.Cecil從頭創建一個簡單的程序?到目前爲止,我所能找到的所有示例和教程都假設您正在使用現有程序集,閱讀或進行小改動。如何使用Mono.Cecil創建HelloWorld.exe
6
A
回答
8
請看下面的代碼,讓你開始:
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");
1
我在這裏沒有筆記本電腦(我在街上行走),所以我不能寫和展示給你一個完整的例子,但它很簡單,就像你已經看到的其他例子。但是你需要創建一個並保存它的文件。
您需要創建一個AssemblyDefinition,一個ModuleDefinition,一個類型和方法並將其保存到磁盤。
你需要記住它的IL和元數據編寫器沒有編譯器。例如,
檢查this。
相關問題
- 1. 如何在Mono.Cecil中創建Ldarg_S指令?
- 2. 如何使用Mono.Cecil創建重寫方法?
- 3. 靜態構造函數的創建[Mono.Cecil]
- 4. Mono.Cecil實例化動態創建類型
- 5. 使用Mono.Cecil創建帶有內聯參數的IL指令
- 6. 如何使用Mono.Cecil/dnlib編輯AssemblyInfo?
- 7. 如何在Mono.Cecil中爲MethodReference創建GenericParameter返回類型?
- 8. 使用Mono.Cecil注入方法?
- 9. 需要幫助創建一個簡單的混淆器使用Mono.Cecil
- 10. 如何使用Mono.Cecil能調用一個泛型方法
- 11. 如何使用Mono.Cecil向System.Object.Equals注入調用?
- 12. 如何使用Mono.Cecil獲取所有程序集引用?
- 13. 我想用Mono.Cecil能
- 14. 如何創建與使用
- 15. 如何使用JavaScript創建
- 16. 如何創建使用JavaScript
- 17. 如何使用PHP創建
- 18. 如何創建使用PropertyBuilder
- 19. 如何創建使用MvcSiteMap
- 20. 如何使用JavaScript創建
- 21. 如何創建使用PowerShell
- 22. 如何創建使用XSLT
- 23. 如何創建使用Oracle
- 24. 如何創建使用Elasticsearch
- 25. 如何創建使用HTML5
- 26. 如何創建使用jQuery
- 27. 如何創建使用LWJGL
- 28. 如何創建/使用MembershipProvider?
- 29. 如何創建使用AutoFixture
- 30. 如何創建使用Ajax