使用Cecil修改.Net程序集

Cecil 是 Mono 的一个子项目,用于对程序集进行读写,并且已经用于 Mono 的调试,Reflector 也使用它作为底层库。最近把 DbEntry 使用 Emit 生成程序集的方式,改成了使用 Cecil 的方式,就我的感受来说,Cecil 是比较优秀的,有一些地方,比 Emit 使用起来还舒服的多;不过,有一些地方也比较繁琐。

我使用的是 Git 里的最新版本,如果大家要测试的话,也建议使用 Git 版,所以,需要安装一个 Git 客户端。

这里,用一个非常简单的例子,说明一下 Cecil 的基本用法。

首先,我们编写一个测试用的程序集 TestApp.exe :

using System;
namespace TestApp
{
   class Program
   {
     static void Main()
     {
       Console.WriteLine("Main");
     }
     private static void Before()
     {
       Console.WriteLine("Before");
     }
     private static void After()
     {
       Console.WriteLine("After");
     }
   }
}

然后,编写一个使用 Cecil 进行改写的应用 CecilTest.exe :

using System;
using System.Linq;
using Mono.Cecil;
using Mono.Cecil.Cil;
namespace CecilTest
{
   class Program
   {
     static void Main(string[] args)
     {
       if(args.Length != 1)
       {
         Console.WriteLine("Usage: CecilTest TestApp.exe");
       }
       var m = ModuleDefinition.ReadModule(args[0]);
       var prog = m.Types.First(p => p.Name == "Program");
       var main = prog.Methods.First(p => p.Name == "Main");
       var before = prog.Methods.First(p => p.Name == "Before");
       var after = prog.Methods.First(p => p.Name == "After");
       var il = main.Body.GetILProcessor();
       il.InsertBefore(main.Body.Instructions[0], il.Create(OpCodes.Call, before));
       il.InsertBefore(main.Body.Instructions.Last(), il.Create(OpCodes.Call, after));
       m.Write(args[0] + ".exe");
       Console.WriteLine("Done");
       Console.ReadLine();
     }
   }
}

时间: 2024-12-28 02:51:18

使用Cecil修改.Net程序集的相关文章

C# 使用Mono Cecil 修改程序集,添加一个字段和属性,方法,怎样做实现

问题描述 在C#中,我想使用MonoCecil修改程序集,就是打开一个程序集,然后在里面添加一个字段和属性,方法,并且给字段赋一个初始值,然后保存程序集,怎样做实现,给一下代码,谢谢 解决方案 解决方案二:快,谁给个答案,给分啊解决方案三:给个恢复啊,,,,解决方案四:回复一下啊,,,,,,,,,,,,

Mono.Cecil - 0.6

原文:Mono.Cecil - 0.6项目地址:Mono.Cecil 项目描述:In simple English, with Cecil, you can load existing managed assemblies, browse all the contained types, modify them on the fly and save back to the disk the modified assembly. 类似项目:Microsoft CCICommon Compiler

Visual Studio 程序集 详解

using System.Reflection; using System.Runtime.CompilerServices; // //有关程序集的常规信息是通过下列 //属性集控制的.更改这些属性值可修改与程序集 //关联的信息. // //[assembly: AssemblyTitle("")] //[assembly: AssemblyDescription("")] //[assembly: AssemblyConfiguration("&qu

把程序集安装到全局程序集缓存中的步骤_实用技巧

步骤: 1.先创建类库项目,完成编码: 2.对类库项目生成强命名,生成密钥文件:(该名称是加密的哈希密钥或签名.这种强名称可确保正确的组件版本控制.这有助于防止具有相同名称的组件相互冲突或被消耗应用程序误用) 使用.net Framework 开发包中bin目录下的SN工具生成加密密钥对,例如:在D盘建立文件夹:GACkey,然后在命令行中执行:sn -k "D:\GACkey\GACkey.snk" ,则在D:\GACkey\GACkey.snk就会生成密钥文件: 3.关联类库文件和

用ildasm/ilasm修改IL代码(操作步骤)

在开发中遇到这样一个场景,需要修改一个dll文件(.NET程序集)中某些地方的类型名称,但没有源代码,只能修改IL代码. 操作步骤如下: 1. 运行ildasm ildasm是由微软提供的.NET程序反编译工具,位于"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\". 2. 用ildasm打开要修改的程序集,如下图: 3. 通过ildasm保存为IL文件 选择菜单File>Dump,选择UTF-8编码,如下图: 4. 用文本编

字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

原文:字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串 关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来讲第三篇,如何应用上面所学内容,设计一个字符串混淆程序. 先设计一个控制台程序,它是将要被我混淆的程序集文件: public static void Main() { try { RunSnippet(); } cat

引用第三方类库的私有类与私有方法

问题:引用第三方类库的私有类与私有方法 解决方法 此问题的本质就是修改.net 程序集的元数据,把相应的类与方法的私有修饰符改为公有 . 假设有以下的程序集: CancelSealedClassLib.dll 有如下类型的定义 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CancelSealedClassLib { class mySealedCla

手把手教你----使用Nuget管理自己的项目库

什么是NuGet 为什么用NuGet 怎么使用NuGet STEP1 在NuGet官网上注册并获取API Key STEP2 下载NuGetexe STEP3 设置API Key SETP4 开发自己的类库 STEP5 产生并修改nuspec STEP6 产生类库包Library Package STEP7 发布类库包 STEP8 测试以及更新类库包 什么是NuGet? 官网上的解释:NuGet is the package manager for the Microsoft developme

C#实现vb6和html都可以调用的ActiveX,

新建控件库 项目,AssemblyInfo.cs 修改为 程序代码 using System.Reflection;using System.Runtime.InteropServices;using System.Security; // 有关程序集的常规信息通过下列属性集// 控制.更改这些属性值可修改// 与程序集关联的信息.[assembly: AssemblyTitle("ORRSG")][assembly: AssemblyDescription("ActiveX