Dot-Net

程序化 MSIL 注入

  • April 3, 2018

假設我有一個這樣的錯誤應用程序:

using System;

namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine("2 + 1 = {0}", Add(2, 1));
       }

       static int Add(int x, int y)
       {
           return x + x; // <-- oops!
       }
   }
}

該應用程序已經編譯並部署到野外。有人發現了這個錯誤,現在他們正在請求修復它。雖然我可以使用修復程序重新部署此應用程序,但由於我無法控制的原因,這非常麻煩——我只想為該錯誤編寫一個更新檔程序。

具體來說,我想將我自己的 MSIL 插入到有問題的彙編源文件中。我以前從來沒有做過這樣的事情,Google搜尋也沒有找到任何有用的資訊。如果我可以在上面的程式碼中看到如何執行此操作的範例,它將極大地幫助我:)

如何以程式方式將自己的 MSIL 注入已編譯的 .NET 程序集?

$$ Edit to add: $$對於那些問:我不需要執行時熱交換。關閉應用程序,操作程序集,然後再次重新啟動程序對我來說非常好。 $$ Edit one more time: $$看起來普遍的共識是“操縱程序集是修補程序的方法”。如果這是一個壞主意,我不會走那條路。 我會留下這個問題,因為 MSIL 注入可能仍然對其他目的有用:)

我想我會問的問題是“你將如何部署更新檔”?在某個地方,您必須部署一些東西來修復已經存在的錯誤。為什麼重新編譯 dll 並發布固定版本真的是個問題?我的猜測是,弄清楚如何以程式方式註入 MSIL 將比簡單地重新部署固定程序集更麻煩。

您是否考慮過將原始碼直接插入到程序集中,而不是在執行時注入 MSIL?

您可以使用 ildasm 進行拆卸,插入您的 MSIL,然後使用 ilasm 重新組裝,然後部署其產品。

引用自:https://stackoverflow.com/questions/512690