1. 程式人生 > >客戶的一個緊急bug,我用了兩種方式進行 C# 反編譯修改原始碼

客戶的一個緊急bug,我用了兩種方式進行 C# 反編譯修改原始碼

## 一:背景 ### 1. 講故事 週五下午運營反饋了一個緊急bug,說客戶那邊一個資訊列表打不開,急需解決,附帶的日誌檔案也發過來了,看了下日誌大概是這樣的: ``` C# 日期:2020-11-13 12:25:45,923 執行緒ID:[3924] 日誌級別:INFO 錯誤類:xxx property:[(null)] - 錯誤描述:應用程式出現了未捕獲的異常,Message:該字串未被識別為有效的 DateTime。; StackTrace: 在 System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) 在 System.Data.ConstNode..ctor(DataTable table, ValueType type, Object constant, Boolean fParseQuotes) 在 System.Data.ExpressionParser.Parse() 在 System.Data.DataExpression..ctor(DataTable table, String expression, Type type) 在 System.Data.Select..ctor(DataTable table, String filterExpression, String sort, DataViewRowState recordStates) 在 System.Data.DataTable.Select(String filterExpression) ``` 從異常資訊可以看到,大概就是 DataTable.Select 的時候丟擲了異常,通過呼叫堆疊追查了下程式碼大概是這樣的。 ``` C# public Task QueryDataTable() { var dt = new DataTable(); dt.Columns.Add(new DataColumn("SendTime")); dt.Rows.Add(dt.NewRow()["SendTime"] = "2020/11/14"); var where = $" SendTime < #{DateTime.Now.ToString()}#"; var query = dt.Select(where).CopyToDataTable(); } ``` 大坑就在這裡,絕大多數時候過濾 DataTable 可以採用這樣的寫法 : `SendTime < #2020/11/5#`,但是客戶在新加坡,全英文作業系統,而且時間格式也不知道設定成啥樣了,我估計時間格式包含了類似的 #,正好又遇到了前後綴 `#` ,拆分上就出錯了,導致了經典的 `該字串未被識別為有效的 DateTime` 異常被丟擲。 這個 bug 改起來還是很簡單的,將 # 換成 ' 即可,也就是: `SendTime < '2020/11/5'`,如果一切順利的話,文章就應該到此為止了,可恰恰上天捉弄,因為是緊急bug,研發老大 & 專案實施 都請假了,我一個人還真搞不定,也不知道給了客戶哪一個 release 版,不想節外生枝,為了先解決這個問題,我想到了一個好辦法,反編譯修改,這是代價最小的,也能最快的搞定。 ## 二:使用 dnspy 反編譯修改程式碼 ### 1. 使用 dnspy 的 編輯方法 模式 為了更好的理解通過 dnspy 修改,先來聊一聊 dnspy 最便捷的修改 dll 的方式:`編輯方法`,這種方式非常方便,無需理解 IL 程式碼,為了演示,我舉一個簡單的加法運算。 ``` C# static void Main(string[] args) { var i = 10; var j = 20; Console.WriteLine($"{i}+{j}={i + j}"); Console.ReadLine(); } ``` ![](https://img2020.cnblogs.com/other/214741/202011/214741-20201117122600702-1229479100.png) 接下來將 `var i= 10` 改成 `var i=100` 的步驟為: * 右鍵 `編輯方法` * 彈框修改 `var i=10 ` -> `var i=100` * 點選右下角 `編譯` * Ctrl + Shift + S 全部儲存 * 彈出框中 選擇 `確定` 截圖大概如下: 最後 bin 目錄下的 exe 就被成功修改了,雙擊之後就能看到你的成果啦! ![](https://img2020.cnblogs.com/other/214741/202011/214741-20201117122602647-1585478884.png)