使用Reflexil修改类库

因为公司一个项目需要修改PPS的颜色,于是反编译了PPS的代码发现,作者很不厚道的把所有着色都HardCode在代码里

private static void InsertDefaultSeriesColors(AnalyticChartTemplate template)
{
    template.Add_CustomColor(Color.FromArgb(0, 0, 0, 0));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xc0, 80, 0x4d));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x9b, 0xbb, 0x59));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xdd, 0xd9, 0xc3));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x4b, 0xac, 0xc6));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xf7, 150, 70));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x93, 0x89, 0x53));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x8d, 0xb3, 0xe2));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xe5, 0xb9, 0xb7));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xd7, 0xe3, 0xbc));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xcc, 0xc1, 0xd9));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xb7, 0xdd, 0xe8));
    template.Add_CustomColor(Color.FromArgb(0xec, 0xfb, 0xd5, 0xb5));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x80, 100, 0xa2));
    template.Add_CustomColor(Color.FromArgb(0xec, 15, 0x24, 0x3e));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x63, 0x24, 0x23));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x4f, 0x61, 40));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x5f, 0x49, 0x7a));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x20, 0x58, 0x67));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x97, 0x48, 6));
    template.Add_CustomColor(Color.FromArgb(0xec, 0x49, 0x44, 0x29));
}
在没有其它办法下,只好尝试修改PPS的类库,再加上原有签名重新部署一次。
网上找到Reflector的一个插件Reflexil,附上地址
http://reflexil.net/
这个插件能够直接在Reflctor下修改类库,并且保留原有签名, 原本就可以解决我所有问题,但是尝试过后,发现保存后的类库是延迟签名的, 什么延迟签名,可以参考下这链接
http://msdn.microsoft.com/en-us/library/t07a3dye.aspx
所以不能直接部署到GAC, 头疼花了接近一天的时间, 去寻找如何部署, 在快要绝望的时候, 意外的发现可以使用ilasm对类库再签名, 这就意味着我可以先使用ilasm进行反编译,再使用原有资源
进行签名, 为了印证是否正确 ,写了如下指命
进入vs工具命令行
ildasm C:\Microsoft.PerformancePoint.Scorecards.ServerRendering.Patched.dll /out:c:\Microsoft.PerformancePoint.Scorecards.ServerRendering.il
进入Microsoft.Net下framework
ilasm c:\Microsoft.PerformancePoint.Scorecards.ServerRendering.il /dll
发现能够注册到GAC, 但是又发现了一个问题,传统GAC上根本看不到我注册的dll, 原来又是我粗心了, 使用了.net 4.0的ilasm , 使用到4.0的ilasm重编译的时候会编译成4.0的dll, 放的位置跟
2.0的位置是不相同的, 于是使用2.0 ilasm重新试一遍, 大功造成 。
在这做一个总结, 要修改原有类库并使用原有签名的步骤是
1. 使用Reflexil进行修改,并保存为一个延迟签名的文件
2. 使用对应版本的ilasm进行反编译再重编译
 
posted @ 2013-09-09 16:42  一只老鼠  阅读(1445)  评论(1编辑  收藏  举报