C#實現熱更新服務器程序的具體過程

熱更新有沒有解決一些開發問題的痛點

其實首先探討的一個問題就是,熱更服務器程序到底有沒有必要出現,或者說有沒有適用場景,我個人覺得吧還是有的。

如果真的可以在不重啟應用的情況下實現邏輯的更新,這未嘗對於一些緊急的情況不是一個好消息,尤其是一些小團隊、小創業公司剛起步的時候,技術測試流程和人力不會像成規模的企業那樣完善,那麼帶來的問題就是上線後的應用、遊戲可能會存在一些Bug,如果不嚴重還好,可以留到下一個迭代更新統一修復,但是如果嚴重瞭,又考慮如果此刻關服修復會導致用戶流失,那麼這時候不停服熱更新就有瞭應用場景,可以在用戶無感知的情況下進行邏輯的修復工作。這也是熱更功能主要的適用場景,至於增加新功能或者刪除一些功能也可以通過不停服的方式來操作。

那麼說完這個需求後,接下就是怎麼才能實現這個功能。其實這個功能主要還是利用瞭C#自帶的反射,在新的Dotnet框架中.net core3.0以後和.net5.0以後,微軟對Assembly加載做瞭進一步整理,雖然以前也有類似功能,但是眾所周知的原因,以前的.net版本混亂,現在微軟既開源也統一化版本,可以說在未來時間裡,.Net的潛力不可估量,那麼我所講的,也是基於較新的框架版本實現的。

熱更新實現原理

AssemblyLoadContext 這個類就是今天的主角,它的主要功能就是隔離式的程序上下文,什麼意思,就是它具備一定保護,可以使動態加載的程序集不和靜態加載的程序集混合在一起,而是獨立運行在類似沙盒的空間裡,但是又具備相互訪問的權限。這就很厲害瞭,這樣一來,我們可以加載自己的程序集,然後供本來應用調用,在需要更新的時候,把新的程序集加載進來,並且替換舊的程序,釋放舊的程序集,這樣就可以無縫銜接的執行新的邏輯瞭。

下面我就借用我自己寫的框架來實現這個熱更的過程,如果對熱更原理本身感興趣的,也可以去看看我寫的熱更源碼,我會在文章最下面貼上我的開源項目地址,源碼裡面基本上都是有註釋的,所以看起來也不會很難。

具體的實現過程

首先我們創建一個.Net5.0或者.Netcore3.1的項目,取名Abc。​

創建成功,我們找到依懶項,右擊管理Nuget程序包,選擇瀏覽標簽搜索:EasySharpFrame,然後選中後點擊下載按鈕進行安裝。

安裝完成後,框架就算成功安裝好瞭,接下來,我們再從解決方案右擊新建一個新的項目,這個項目就是用於熱更邏輯實現的動態庫,名字就叫Hotfix,創建之後,在解決方案資源管理器一欄中就會看到這個項目已經成功添加進去瞭,之後我們右擊這個Hotfix項目的依賴項,找到添加項目引用,直接把 Abc 勾選確定,至此項目的添加創建步驟就完成瞭。​​​​

接下來就是開始寫代碼實際應用瞭,首先在Abc主項目中的Program.cs入口中,調用框架中熱更管理單例。因為我們沒有更改Hotfix項目的默認配置,所以生成出來的Dll文件名就是Hotfix,然後我們在Hotfix項目裡添加一個Main.cs的入口文件,這裡通過熱更管理器就完成瞭初始化,後面每次重載也隻需要重復這個步驟就可以瞭。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        // 確保進行不會自動結束
        while (true)
        {
            // 調用熱更模塊加載Hotfix
            HotfixMgr.Instance.Load("Hotfix", "Hotfix.Main");
            // 回車繼續,否則阻塞
            Console.ReadLine();
        }
    }
}

接下來,我們在Hotfix項目裡Main.cs中加點測試內容。

public class Main
{
    public void Hello()
    {
        Console.WriteLine("Hello World");
    }
}

並且在剛剛主工程代碼裡加點東西。

// 調用熱更模塊加載Hotfix
HotfixMgr.Instance.Load("Hotfix", "Hotfix.Main");
// 這裡可以通過Agent調用測試入口的函數
HotfixMgr.Instance.Agent.Hello();
// 回車繼續,否則阻塞
Console.ReadLine();

這樣一個簡單的熱更事例就完成瞭,接下來生成解決方案。然後找到Hotfix項目生成路徑,把關於Hotfix.dll和Hotfix.pdb兩個文件復制粘貼到Abc的生成路徑下。雙擊Abc.exe,啟動事例查看結果。註:pdb是用於給運行時提供出錯時準確提示錯誤的解釋文件,實際運行隻需要dll,如果不需要查看問題出處,可以隻復制dll即可。​

此時不要關閉控制臺,繼續回到VS中,修改一下Main.cs的內容,並且這次隻生成Hotfix項目,把生成好的dll和pdb復制到Abc中。

public class Main
{
    public void Hello()
    {
        // 修改前
        // Console.WriteLine("Hello World");
        // 修改後
        Console.WriteLine("Hello New World");
    }
}

替換完成後,在控制臺回車一下,結果顯示,新的邏輯已經更新至程序中。

以上就是一個簡單的熱更流程展示,框架提供的熱更功能還有更多功能,這裡隻是簡單介紹一下熱更的原理與實現。如果對框架感興趣的朋友可以到github上去瞭解。

項目地址:github.com/suxf/EasySh…

總結

到此這篇關於C#實現熱更新服務器程序的文章就介紹到這瞭,更多相關C#熱更新服務器程序內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: