C#動態(tài)加載組件后如何在開發(fā)環(huán)境中調(diào)試詳解
動態(tài)加載組件
那就是簡單的Assembly.Load動態(tài)加載dll而以。這網(wǎng)上資料也有不少。基本的思路基本上就是在本地上一個指定目錄如【plugs】存在著一堆dll文件。主程序在初始運行時一般會把指定目錄下的dll一次性用Assembly.Load加載進來。只要把指定目錄變成從網(wǎng)絡(luò)加載,或者加載指定目錄前先檢查網(wǎng)絡(luò)上的是否有新版本。這就簡單做成個最簡單版本的熱更新。
多數(shù)網(wǎng)上的資料就是然后就沒有然后了。很多人就發(fā)現(xiàn)產(chǎn)品是通過動態(tài)加載組件了。但開發(fā)人員根本無法調(diào)試啊。不能調(diào)試就意味著開發(fā)難度大啊。出了Bug我都不知道怎么查錯。難度開發(fā)就要像在正式環(huán)境那樣子不停的寫log文件。如果這樣子的動態(tài)加載真的得不嘗失。只是簡單的動態(tài)加載對產(chǎn)品做出的優(yōu)化可能只是5%,但對于開發(fā)效率來講這可不止減少5%的問題。當有也有不少人為了能讓組件項目能調(diào)試都會新建一個項目直接引用組件項目。通過這種曲線救國的方式來解決問題的。
開發(fā)環(huán)境中怎么調(diào)試
用VS IDE開發(fā)時為什么能夠調(diào)試。VS IDE在的操作原理還是通過Ms-build來生成程序集的。只有dll存在了才能進行調(diào)試斷點的。這我為動態(tài)加載也是加載了dll文件了那怎么斷點沒有效果呢。那細心的人也知道在生成程序集的時,同時還生成了一個同名稱的pdb文件。有興趣的朋友可以在百科上找到相關(guān)資料。說白了有了這個pdb文件才能用VS IDE進行調(diào)試斷點的。
用VS建立方案
MyPlatform為主項目,主要用于動態(tài)加載組件。
MyPlatform.Standard為定義標準的接口項目。所有的基礎(chǔ)接口,抽像類都應該出自這個項目。
MyPlatform.ModuleHelloWord為第一個組件模組。寫代碼的人第一個功能都是HelloWord。
定義組件規(guī)則
IPlugModule,IPlugItem為每個組件模組定義好要顯示的名稱,和調(diào)用指定組件時入口方法。先定義了最基本功能以后再加另的功能。
實現(xiàn)第一個組件模組
HelloWordModule,HelloWordPlug做為第一個組件模組,實現(xiàn)的功能當然也是最簡單的。
實現(xiàn)動態(tài)加載
想動態(tài)加載組件。前兩步定義好規(guī)則和第一個組件模組也出來了?,F(xiàn)在到主項目平臺來了。要動態(tài)加載還是要一個組件管理功能來管理加載對應的組件模組項目。組件管理只應該有從那里加載模組特定。按這分析。組件管理類
按照這定義好完善功能。
IDE項目設(shè)置
為了方便開發(fā)調(diào)試。對項目使用設(shè)置。
MyPlatform項目-》屬性-》生成-》輸出
MyPlatform.ModuleHelloWord輸出為位置為組件模組加載目錄
對解決方案進行設(shè)置。右鍵屬性-》項目依賴。把組件也選上。這所講的依賴并不是主項目引用了組件項目,而是在生成主項目前先把選中的項目生成成功再生成編譯主項目。
輸出效果
從項目上來看,怎么什么輸出信息都沒有呢。打開組件目錄發(fā)現(xiàn)什么都沒有。原來都沒有生成組件到這個目錄。那你可能就是忘記上面提交到第三步設(shè)置。請回去看一次。
這就簡單的能動態(tài)加載了。這的思路和網(wǎng)上的基本上都一樣的。但發(fā)現(xiàn)就是不能斷點調(diào)試。不能調(diào)試這就是在耍流氓嘛。
修改代碼支持斷調(diào)試
查看Assembly.Load的方法發(fā)現(xiàn)有意思的重載。除了加載一個流文件的方法??梢园l(fā)現(xiàn)還有三個方法是加載兩流文件的。一個帶有安全參數(shù)的方法。不過由于第一個已經(jīng)過時棄用,建議使用第三個方法。那其實就只有兩個方法可用。那就是說在加載時能同時把pdb程序調(diào)試數(shù)據(jù)庫也能加載了。這就能很好解決VS IDE能調(diào)用的問題了。
改動代碼。加載dll文件時判斷pdb文件是否存在,存在則一并加載。這方法也使用在debug模式下。那正式環(huán)境一般不會把pdb文件也發(fā)布出去。所以就走了分支。
能調(diào)試的輸出效果
附上源代碼:點擊下載
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。
上一篇:C#創(chuàng)建Windows服務(wù)的實現(xiàn)方法
欄 目:C#教程
下一篇:C# WPF上位機實現(xiàn)和下位機TCP通訊的方法
本文標題:C#動態(tài)加載組件后如何在開發(fā)環(huán)境中調(diào)試詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4812.html
您可能感興趣的文章
- 01-10C#動態(tài)創(chuàng)建button的方法
- 01-10C#動態(tài)創(chuàng)建Access數(shù)據(jù)庫及密碼的方法
- 01-10C#獲取動態(tài)生成的CheckBox值
- 01-10C#中DataGridView動態(tài)添加行及添加列的方法
- 01-10輕松學習C#的ArrayList類
- 01-10基于C#實現(xiàn)12306的動態(tài)驗證碼變成靜態(tài)驗證碼的方法
- 01-10C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程
- 01-10C#如何動態(tài)設(shè)置屏幕分辨率
- 01-10C#實現(xiàn)Excel動態(tài)生成PivotTable
- 01-10適用于WebForm Mvc的Pager分頁組件C#實現(xiàn)


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?