欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)熱更新服務(wù)器程序的具體過程

 更新時間:2021年07月12日 10:43:53   作者:楓葉不太紅  
什么是熱更新?就是不停機(jī)更新,實(shí)時更新,這篇文章主要給大家介紹了關(guān)于C#實(shí)現(xiàn)熱更新服務(wù)器程序的具體過程,通過熱更新改善用戶體驗(yàn)(節(jié)省流量、時間、操作程度),需要的朋友可以參考下

熱更新有沒有解決一些開發(fā)問題的痛點(diǎn)

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

如果真的可以在不重啟應(yīng)用的情況下實(shí)現(xiàn)邏輯的更新,這未嘗對于一些緊急的情況不是一個好消息,尤其是一些小團(tuán)隊(duì)、小創(chuàng)業(yè)公司剛起步的時候,技術(shù)測試流程和人力不會像成規(guī)模的企業(yè)那樣完善,那么帶來的問題就是上線后的應(yīng)用、游戲可能會存在一些Bug,如果不嚴(yán)重還好,可以留到下一個迭代更新統(tǒng)一修復(fù),但是如果嚴(yán)重了,又考慮如果此刻關(guān)服修復(fù)會導(dǎo)致用戶流失,那么這時候不停服熱更新就有了應(yīng)用場景,可以在用戶無感知的情況下進(jìn)行邏輯的修復(fù)工作。這也是熱更功能主要的適用場景,至于增加新功能或者刪除一些功能也可以通過不停服的方式來操作。

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

熱更新實(shí)現(xiàn)原理

AssemblyLoadContext 這個類就是今天的主角,它的主要功能就是隔離式的程序上下文,什么意思,就是它具備一定保護(hù),可以使動態(tài)加載的程序集不和靜態(tài)加載的程序集混合在一起,而是獨(dú)立運(yùn)行在類似沙盒的空間里,但是又具備相互訪問的權(quán)限。這就很厲害了,這樣一來,我們可以加載自己的程序集,然后供本來應(yīng)用調(diào)用,在需要更新的時候,把新的程序集加載進(jìn)來,并且替換舊的程序,釋放舊的程序集,這樣就可以無縫銜接的執(zhí)行新的邏輯了。

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

具體的實(shí)現(xiàn)過程

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

創(chuàng)建成功,我們找到依懶項(xiàng),右擊管理Nuget程序包,選擇瀏覽標(biāo)簽搜索:EasySharpFrame,然后選中后點(diǎn)擊下載按鈕進(jìn)行安裝。

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

接下來就是開始寫代碼實(shí)際應(yīng)用了,首先在Abc主項(xiàng)目中的Program.cs入口中,調(diào)用框架中熱更管理單例。因?yàn)槲覀儧]有更改Hotfix項(xiàng)目的默認(rèn)配置,所以生成出來的Dll文件名就是Hotfix,然后我們在Hotfix項(xiàng)目里添加一個Main.cs的入口文件,這里通過熱更管理器就完成了初始化,后面每次重載也只需要重復(fù)這個步驟就可以了。

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

        // 確保進(jìn)行不會自動結(jié)束
        while (true)
        {
            // 調(diào)用熱更模塊加載Hotfix
            HotfixMgr.Instance.Load("Hotfix", "Hotfix.Main");
            // 回車?yán)^續(xù),否則阻塞
            Console.ReadLine();
        }
    }
}

接下來,我們在Hotfix項(xiàng)目里Main.cs中加點(diǎn)測試內(nèi)容。

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

并且在剛剛主工程代碼里加點(diǎn)東西。

// 調(diào)用熱更模塊加載Hotfix
HotfixMgr.Instance.Load("Hotfix", "Hotfix.Main");
// 這里可以通過Agent調(diào)用測試入口的函數(shù)
HotfixMgr.Instance.Agent.Hello();
// 回車?yán)^續(xù),否則阻塞
Console.ReadLine();

這樣一個簡單的熱更事例就完成了,接下來生成解決方案。然后找到Hotfix項(xiàng)目生成路徑,把關(guān)于Hotfix.dll和Hotfix.pdb兩個文件復(fù)制粘貼到Abc的生成路徑下。雙擊Abc.exe,啟動事例查看結(jié)果。注:pdb是用于給運(yùn)行時提供出錯時準(zhǔn)確提示錯誤的解釋文件,實(shí)際運(yùn)行只需要dll,如果不需要查看問題出處,可以只復(fù)制dll即可。​

此時不要關(guān)閉控制臺,繼續(xù)回到VS中,修改一下Main.cs的內(nèi)容,并且這次只生成Hotfix項(xiàng)目,把生成好的dll和pdb復(fù)制到Abc中。

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

替換完成后,在控制臺回車一下,結(jié)果顯示,新的邏輯已經(jīng)更新至程序中。

以上就是一個簡單的熱更流程展示,框架提供的熱更功能還有更多功能,這里只是簡單介紹一下熱更的原理與實(shí)現(xiàn)。如果對框架感興趣的朋友可以到github上去了解。

項(xiàng)目地址:github.com/suxf/EasySh

總結(jié)

到此這篇關(guān)于C#實(shí)現(xiàn)熱更新服務(wù)器程序的文章就介紹到這了,更多相關(guān)C#熱更新服務(wù)器程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#數(shù)字圖像處理之圖像二值化(彩色變黑白)的方法

    C#數(shù)字圖像處理之圖像二值化(彩色變黑白)的方法

    這篇文章主要介紹了C#數(shù)字圖像處理之圖像二值化(彩色變黑白)的方法,可實(shí)現(xiàn)圖像從彩色轉(zhuǎn)變?yōu)楹诎椎男Ч?非常具有實(shí)用價值,需要的朋友可以參考下
    2015-04-04
  • C#中增加SQLite事務(wù)操作支持與使用方法

    C#中增加SQLite事務(wù)操作支持與使用方法

    這篇文章主要介紹了C#中增加SQLite事務(wù)操作支持與使用方法,結(jié)合實(shí)例形式分析了C#中針對SQLite事務(wù)操作的添加及使用技巧,需要的朋友可以參考下
    2017-07-07
  • C#檢查指定對象是否存在于ArrayList集合中的方法

    C#檢查指定對象是否存在于ArrayList集合中的方法

    這篇文章主要介紹了C#檢查指定對象是否存在于ArrayList集合中的方法,涉及C#中Contains方法的使用技巧,需要的朋友可以參考下
    2015-04-04
  • 基于C#實(shí)現(xiàn)語音識別功能詳解

    基于C#實(shí)現(xiàn)語音識別功能詳解

    在.NET4.0中,可以借助System.Speech組件讓電腦來識別我們的聲音。本文將利用該組件實(shí)現(xiàn)語音識別功能,文中實(shí)現(xiàn)過程講解詳細(xì),需要的可以參考一下
    2022-04-04
  • C#中ExecuteNonQuery()返回值注意點(diǎn)分析

    C#中ExecuteNonQuery()返回值注意點(diǎn)分析

    這篇文章主要介紹了C#中ExecuteNonQuery()返回值注意點(diǎn)分析,對于C#數(shù)據(jù)庫程序設(shè)計(jì)有很大的借鑒價值,需要的朋友可以參考下
    2014-08-08
  • 通過C#編寫一個簡易的Windows截屏增強(qiáng)工具

    通過C#編寫一個簡易的Windows截屏增強(qiáng)工具

    在使用?Windows?系統(tǒng)的截屏快捷鍵?PrintScreen?截屏?xí)r,如果需要把截屏保存到文件,需要先粘貼到畫圖工具然后另存為文件。所以本文用C#編寫了一個簡易的Windows截屏增強(qiáng)工具,需要的可以參考一下
    2022-05-05
  • C# 通過同步和異步實(shí)現(xiàn)優(yōu)化做早餐的時間

    C# 通過同步和異步實(shí)現(xiàn)優(yōu)化做早餐的時間

    本文以一個簡單的小例子—如何做一頓早餐及如何優(yōu)化做早餐的時間來讓大家具體了解一下同步和異步方法的區(qū)別,需要的朋友可以參考一下
    2021-12-12
  • WPF+DiffPlex實(shí)現(xiàn)文本比對工具

    WPF+DiffPlex實(shí)現(xiàn)文本比對工具

    現(xiàn)行的文本編輯器大多都具備文本查詢的能力,但是并不能直觀的告訴用戶兩段文字的細(xì)微差異,所以對比工具在某種情況下,就起到了很便捷的效率。本文將利用DiffPlex實(shí)現(xiàn)簡易的文本比對工具,需要的可以參考一下
    2022-11-11
  • 利用C#操作WMI指南

    利用C#操作WMI指南

    WMI提供了一套內(nèi)置在Microsoft Windows操作系統(tǒng)中的豐富的系統(tǒng)管理服務(wù),可以在有大量的應(yīng)用程序、服務(wù)和設(shè)備的系統(tǒng)中提供全方位的管理功能。它允許應(yīng)用程序的開發(fā)者,使用簡單的、一致的機(jī)制,去查詢企業(yè)中的任一臺計(jì)算機(jī)上的信息,或是進(jìn)行系統(tǒng)配置
    2016-11-11
  • C#表達(dá)式目錄樹示例詳解

    C#表達(dá)式目錄樹示例詳解

    這篇文章主要給大家介紹了關(guān)于C#表達(dá)式目錄樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論