使用Reflexil修改類庫

一隻老鼠發表於2013-09-09

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

相關文章