因為公司一個專案需要修改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進行反編譯再重編譯