惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
M
MIT News - Artificial intelligence
L
LangChain Blog
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
J
Java Code Geeks
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
IT之家
IT之家
F
Fortinet All Blogs
博客园 - 聂微东
U
Unit 42
Martin Fowler
Martin Fowler
腾讯CDC
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky

博客园 - vento

[转]15年双11手淘前端技术巡演 - H5性能最佳实践 [转]新兵训练营系列课程——编写优雅代码 [转]新兵训练营系列课程——海量数据存储基础 [转]新兵训练营系列课程——平台RPC框架介绍 [转]mysql binlog in realtime 利用IDA Pro反汇编程序 WinDbg入门 小巧方便的ORM类库——PetaPoco 2011总结 门户网站的ip查询接口 Lucene实践 xp3中运行s60 v3模拟器,出现闪退问题的解决方法 ubuntu日常操作 增加Android模拟器的"Internal Storage"容量 WSGI处理流程图 linux常用命令 如何查看哪些进程和服务器正在使用数据库 了解IIS的主机名(Host Headers)配置项 如何在ubuntu server 10.04中安装vmware tools
使用Mono.Cecil更改程序集dll特性
vento · 2012-05-12 · via 博客园 - vento

工作中发现一个公共组件因为某个类不带有[Serializable]特性,导致保存到memcache时出错。刚好负责的同事请假不在,尝试了iLSpy反编译方法后,最后决定使用Mono.Cecil直接修改现成的程序集dll解决。 示例代码如下:

class Program
    {
        static void Main(string[] args)
        {
            var asmFile = "TestDll.dll";  // 程序集名
            Console.WriteLine("add serializable attribute for '{0}'.", asmFile);

            var asmDef = AssemblyDefinition.ReadAssembly(asmFile, new ReaderParameters
            {
                ReadSymbols = true        // 标识是否读取修改pdb文件
            });

            // 取类名中包含"Entity"字符串的类
            var types = asmDef.Modules
                .SelectMany(m => m.Types)
                .Where(t => t.Name.Contains("Entity"));

            // 设置类为可序列化
            foreach (var type in types)
            {
                type.IsSerializable = true;
            }

            // 重新保存dll
            var newAsmFileName = "TestDll_new.dll";
            asmDef.Write(newAsmFileName, new WriterParameters
            {
                WriteSymbols = true
            });

            Console.WriteLine("new dll has save as {0}.", newAsmFileName);
        }
    }

Mono.Cecil除了可以更改特性,还能把sealed类更改为public类,功能非常强大。 下载demo

参考资料: 使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model