今天一個同事問我,怎麼把Dll動態連結程式庫直接嵌入到C#開發的應用程式本身,讓C#在發布出去的時候,只是一個.exe的檔案,而不是一個檔案夾。我仔細思索了一下這個問題。發現這個問題其實可以總結為一個比較普遍的問題,那就是怎樣把不同種類的檔案包含到C#開發的應用程式自身內,然後變成一個.exe的檔案給使用者發布出去。
其實,思路還是比較簡單的,我們首先把需要包含到應用程式本身的檔案作為外部的資源檔加入到程式中,然後在程式啟動並執行時候,由程式自己自動把資源檔給釋放出來,實際上就達到了,即可包含不同檔案在應用程式內,又可以隨時釋放該檔案並使用的目的。
(1)首先,我們使用VS2005建立一個WindowsForm的開發程式(說個題外話,雖然現在我在公司用的都是VS2010了,但是我還是喜歡VS2005,因為我覺得,只要VS2005都啟動並執行起的程式,VS2010肯定也可以運行。不過,最主要的還是因為我家這個電腦太惱火了,拖起VS2005都已經很卡了,所以就沒有裝VS2010了)。
(2)然後,我們為了測試一個Dll包含到應用程式本身,並保證該應用程式在調用該Dll以後正常運行,我現在用VS裡面提供的帶DLL的控制項,Media Player做一個示範。現在我們要添加該控制項,選擇‘菜單’-‘工具’-‘工具箱項’,如:
(3)我們選擇COM選項卡,選擇Media Player 這個mp3播放控制項,選擇完成後,我們會在工具箱中,發現新添加的這個Media Player控制項。
(4)於是我們直接把這個控制項,拖動到WindowForm表單上。此時,一個播放器,就弄好了。
(5)這個時候我們編譯這個應用程式,會發現,在我們應用程式Bin/Debug目錄下,不但有KContainer這個應用程式,還有2個dll和MediaPlayer相關的動態連結程式庫。
(6)按照常理來說,如果我們要發布我們的這個播放器應用程式,我們就必須把額外的這個兩個dll檔案包含在和這個應用程式一樣的檔案目錄。但是這樣的話,太影響美觀,而且也不便於傳輸給別人使用,畢竟這樣看起來平白無故的要多了2個檔案,那麼我們如何才能讓我們自己只發布一個KContainer程式給別人,然後這個應用程式能照樣正常使用我們這個播放器呢?答案實際上很簡單,我們只需要在我們使用的時候把這個兩個檔案釋放出來,不使用的時候刪除就行了。既然要釋放,那就涉及到包含。要包含很容易就想到資源檔了,所以,現在我們要把這兩個Dll動態連結程式庫,作為KContainer的資源檔包含在KContainer裡面。當然其他檔案類型的包含也是一樣的,只不過這裡包含的是Dll檔案。我反正成功包含過EXE檔案(又給一些想做病毒的同胞們提供了思路了。。。。)。
(6, 1)我們首先把這個兩個動態連結程式庫,以資源的形式匯入到我們的工程檔案中。在這裡,我先建立一個MyDll的檔案夾用於存放這兩個檔案。
(6, 2)然後,我們引入剛才我們產生的兩個DLL動態連結程式庫檔案(其他檔案格式的包含方式如同這個兩個DLL的操作步驟一樣)
(6,2,1)引入這兩個動態連結程式庫
(6,2,1)
(6,2,2)引入後修改這兩個動態連結程式庫的屬性為嵌入資源
(6,2,2)
(6, 3)到此,所有工作都已經準備就緒了,剩下的工作,就是等待在表單自己啟動的時候,把這兩個DLL釋放出來,然後,就可以大功告成了。不過一定要記住,釋放的代碼必須要放在建構函式裡面且放在控制項初始化代碼之前,否則在控制項在初始化的時候找不到動態連結程式庫,程式會無情的被作業系統結束掉,當然最後使用完這些連結庫的刪除,在這個地方就不在敘述了。以下為釋放出這兩個資源的代碼。
(7)現在我們編譯調試,然後把產生的KContainer.exe應用程式拷貝到其他地方運行一下,會發現,當我們運行這個應用程式的時候,這個程式會自動釋放這兩個Dll動態連結程式庫出來。感覺是不是很爽?其實所有檔案比如什麼DOC,XLS,EXE,TXT等格式的檔案都可以這樣操作,把他們包含在這一個應用程式裡面,然後在需要的時候釋放他們,這個時候,你要傳給人家的只是一個exe檔案而已。
工程檔案(663KB):http://www.aozoz.com/Code/KContainer/KContainer.rar
如有任何問題可以發郵件到:Email:k.liuxu@gmail.com或者加QQ:583936908
以上文章由康康撰寫,勞動成果來之不易,轉載時請註明出處