因为公司一个项目需要修改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下frameworkilasm 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进行反编译再重编译