溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

發(fā)布時(shí)間:2021-02-05 11:43:26 來源:億速云 閱讀:240 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

動(dòng)態(tài)加載組件

那就是簡(jiǎn)單的Assembly.Load動(dòng)態(tài)加載dll而以。這網(wǎng)上資料也有不少?;镜乃悸坊旧暇褪窃诒镜厣弦粋€(gè)指定目錄如【plugs】存在著一堆dll文件。主程序在初始運(yùn)行時(shí)一般會(huì)把指定目錄下的dll一次性用Assembly.Load加載進(jìn)來。只要把指定目錄變成從網(wǎng)絡(luò)加載,或者加載指定目錄前先檢查網(wǎng)絡(luò)上的是否有新版本。這就簡(jiǎn)單做成個(gè)最簡(jiǎn)單版本的熱更新。

多數(shù)網(wǎng)上的資料就是然后就沒有然后了。很多人就發(fā)現(xiàn)產(chǎn)品是通過動(dòng)態(tài)加載組件了。但開發(fā)人員根本無法調(diào)試啊。不能調(diào)試就意味著開發(fā)難度大啊。出了Bug我都不知道怎么查錯(cuò)。難度開發(fā)就要像在正式環(huán)境那樣子不停的寫log文件。如果這樣子的動(dòng)態(tài)加載真的得不嘗失。只是簡(jiǎn)單的動(dòng)態(tài)加載對(duì)產(chǎn)品做出的優(yōu)化可能只是5%,但對(duì)于開發(fā)效率來講這可不止減少5%的問題。當(dāng)有也有不少人為了能讓組件項(xiàng)目能調(diào)試都會(huì)新建一個(gè)項(xiàng)目直接引用組件項(xiàng)目。通過這種曲線救國(guó)的方式來解決問題的。

開發(fā)環(huán)境中怎么調(diào)試

用VS IDE開發(fā)時(shí)為什么能夠調(diào)試。VS IDE在的操作原理還是通過Ms-build來生成程序集的。只有dll存在了才能進(jìn)行調(diào)試斷點(diǎn)的。這我為動(dòng)態(tài)加載也是加載了dll文件了那怎么斷點(diǎn)沒有效果呢。那細(xì)心的人也知道在生成程序集的時(shí),同時(shí)還生成了一個(gè)同名稱的pdb文件。有興趣的朋友可以在百科上找到相關(guān)資料。說白了有了這個(gè)pdb文件才能用VS IDE進(jìn)行調(diào)試斷點(diǎn)的。

用VS建立方案

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

MyPlatform為主項(xiàng)目,主要用于動(dòng)態(tài)加載組件。

MyPlatform.Standard為定義標(biāo)準(zhǔn)的接口項(xiàng)目。所有的基礎(chǔ)接口,抽像類都應(yīng)該出自這個(gè)項(xiàng)目。

MyPlatform.ModuleHelloWord為第一個(gè)組件模組。寫代碼的人第一個(gè)功能都是HelloWord。

定義組件規(guī)則

IPlugModule,IPlugItem為每個(gè)組件模組定義好要顯示的名稱,和調(diào)用指定組件時(shí)入口方法。先定義了最基本功能以后再加另的功能。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

實(shí)現(xiàn)第一個(gè)組件模組

HelloWordModule,HelloWordPlug做為第一個(gè)組件模組,實(shí)現(xiàn)的功能當(dāng)然也是最簡(jiǎn)單的。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

實(shí)現(xiàn)動(dòng)態(tài)加載

想動(dòng)態(tài)加載組件。前兩步定義好規(guī)則和第一個(gè)組件模組也出來了。現(xiàn)在到主項(xiàng)目平臺(tái)來了。要?jiǎng)討B(tài)加載還是要一個(gè)組件管理功能來管理加載對(duì)應(yīng)的組件模組項(xiàng)目。組件管理只應(yīng)該有從那里加載模組特定。按這分析。組件管理類

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

按照這定義好完善功能。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

IDE項(xiàng)目設(shè)置

為了方便開發(fā)調(diào)試。對(duì)項(xiàng)目使用設(shè)置。

MyPlatform項(xiàng)目-》屬性-》生成-》輸出

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

MyPlatform.ModuleHelloWord輸出為位置為組件模組加載目錄

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

對(duì)解決方案進(jìn)行設(shè)置。右鍵屬性-》項(xiàng)目依賴。把組件也選上。這所講的依賴并不是主項(xiàng)目引用了組件項(xiàng)目,而是在生成主項(xiàng)目前先把選中的項(xiàng)目生成成功再生成編譯主項(xiàng)目。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

輸出效果

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

從項(xiàng)目上來看,怎么什么輸出信息都沒有呢。打開組件目錄發(fā)現(xiàn)什么都沒有。原來都沒有生成組件到這個(gè)目錄。那你可能就是忘記上面提交到第三步設(shè)置。請(qǐng)回去看一次。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

這就簡(jiǎn)單的能動(dòng)態(tài)加載了。這的思路和網(wǎng)上的基本上都一樣的。但發(fā)現(xiàn)就是不能斷點(diǎn)調(diào)試。不能調(diào)試這就是在耍流氓嘛。

修改代碼支持?jǐn)嗾{(diào)試

查看Assembly.Load的方法發(fā)現(xiàn)有意思的重載。除了加載一個(gè)流文件的方法。可以發(fā)現(xiàn)還有三個(gè)方法是加載兩流文件的。一個(gè)帶有安全參數(shù)的方法。不過由于第一個(gè)已經(jīng)過時(shí)棄用,建議使用第三個(gè)方法。那其實(shí)就只有兩個(gè)方法可用。那就是說在加載時(shí)能同時(shí)把pdb程序調(diào)試數(shù)據(jù)庫(kù)也能加載了。這就能很好解決VS IDE能調(diào)用的問題了。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

改動(dòng)代碼。加載dll文件時(shí)判斷pdb文件是否存在,存在則一并加載。這方法也使用在debug模式下。那正式環(huán)境一般不會(huì)把pdb文件也發(fā)布出去。所以就走了分支。

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

能調(diào)試的輸出效果

C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例

以上是“C#動(dòng)態(tài)加載組件后在開發(fā)環(huán)境中調(diào)試示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI