2 回答
TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
C#不能寫你說的那種DLL,C#寫的DLL只是個(gè)類庫,不是標(biāo)準(zhǔn)DLL.
你說的那是標(biāo)準(zhǔn)DLL.入口函數(shù)是DllMain函數(shù)
補(bǔ)充:如果是標(biāo)準(zhǔn)DLL,C#無能為力.
都跟你說了C#寫的DLL不是標(biāo)準(zhǔn)DLL.只是個(gè)類庫.所以不可能用LoadLibrary來調(diào)用.
你既然已經(jīng)注入了,可以用反射來實(shí)現(xiàn)調(diào)用
你可以通過Assembly.LoadFrom(路徑)這個(gè)函數(shù)來加載C#的DLL.這樣加載的DLL和Library加載的是一樣的,都是注入所有進(jìn)程空間的.
Assembly assembly = Assembly.LoadFrom(strValue);
然后得到這個(gè)assembly之后.可以得到這個(gè)加載DLL類的所有,比如類的構(gòu)造函數(shù)
Type tmpType = assembly.GetType(dataType);
ConstructorInfo objConstructor = type.GetConstructor(System.Type.EmptyTypes);
然后通過objConstructor 構(gòu)造類的對(duì)象
if (objConstructor != null)
{
objDataAccess = (IDataAccess)objConstructor.Invoke(null);//調(diào)用構(gòu)造
}
得到具體對(duì)象之后可以通過對(duì)象的InvokeMethod來調(diào)用具體的方法
TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
一、什么是DLL 以及使用它的好處
1、DLL 即:動(dòng)態(tài)鏈接庫
DLL是Dynamic Link Library 的縮寫形式,DLL是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動(dòng)態(tài)鏈接提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個(gè) DLL 中,該 DLL 包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開存儲(chǔ)的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個(gè)應(yīng)用程序可同時(shí)訪問內(nèi)存中單個(gè)DLL 副本的內(nèi)容。DLL 是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫。(來自百度)
2、DLL的好處主要有:
1)當(dāng)程序越來越龐大時(shí),DLL避免了EXE文件的過大。分成DLL之后,不用把全部功能都集中到EXE里,需要的時(shí)候才調(diào)入內(nèi)存。
2)DLL模塊化了生產(chǎn)程序。DLL是產(chǎn)品,EXE就是個(gè)集裝箱。因此對(duì)DLL模塊的更新只需要替換此DLL文件即可,不用更新整個(gè)程序。
3)編譯EXE時(shí),不用編譯DLL的內(nèi)容,加快了編譯速度。
4)DLL可重用。當(dāng)一個(gè)DLL模式設(shè)計(jì)好之后,可以被其它項(xiàng)目或程序所引用。
5)DLL可以起到保密的作用。也就是說DLL可以將實(shí)現(xiàn)功能的源代碼隱藏起來,調(diào)用者只能使用而不能看到其內(nèi)部代碼。
“動(dòng)態(tài)鏈接”這幾字指明了DLLs是如何工作的。對(duì)于常規(guī)的函數(shù)庫,鏈接器從中拷貝它需要的所有庫函數(shù),并把確切的函數(shù)地址傳送給調(diào)用這些函數(shù)的程序。而對(duì)于DLLs,函數(shù)儲(chǔ)存在一個(gè)獨(dú)立的動(dòng)態(tài)鏈接庫文件中。在創(chuàng)建Windows程序時(shí),鏈接過程并不把DLLs文件鏈接到程序上。直到程序運(yùn)行并調(diào)用一個(gè)DLLs中的函數(shù)時(shí),該程序才要求這個(gè)函數(shù)的地址。此時(shí)Windows才在DLLs中尋找被調(diào)用函數(shù),并把它的地址傳送給調(diào)用程序。采用這種方法,DLLs達(dá)到了復(fù)用代碼的極限。
二、在VS2010中如何創(chuàng)建和編寫DLL
方法很簡單,就是在程序的解決方案中添加一個(gè)項(xiàng)目,然后選擇“類庫”。注意,一定要在“解決方案”上添加項(xiàng)目才行,在項(xiàng)目中只能添加類文件了。類庫項(xiàng)目一但添加,在程序編譯的時(shí)候就會(huì)自動(dòng)生成為DLL文件。
至于編寫DLL 這和編寫類文件代碼是一致的。你可以在多個(gè)CS類文件中編寫,也可以全放在一起CS類文件中編寫。當(dāng)然推薦的方式是根據(jù)功能分類將類庫分別寫在不同的CS文件中。(雖然在不同文件中,但同屬一個(gè)項(xiàng)目的類文件會(huì)被編譯進(jìn)一個(gè)DLL庫文件中)
三、在VS2010中如何使用自己編寫的DLL
方法也很簡單,在你的程序中的解決方案管理器里,找到“引用”然后點(diǎn)右鍵添加,在彈出的對(duì)話框中選擇“瀏覽”,然后選擇你剛才創(chuàng)建并編譯過的DLL文件。然后在程序文件中使用using 來引入你DLL中的命名空間。注:如果DLL項(xiàng)目就在你當(dāng)前的程序解決方案中,那么你可以直接在添加“引用”中選擇“項(xiàng)目”而不是“瀏覽”。這樣就可以直接引用本解決方案中編寫的DLL類庫。
四、在VS2010如果讓DLL文件通過引用添加到新程序后依然可以在新程序代碼中通過智能感知看到代碼的注釋(只包含那些\\\的注釋 \\和\**\的注釋是無法看到的)
方法是:在你創(chuàng)建DLL類庫之后,右鍵單擊這個(gè)DLL類庫項(xiàng)目的屬性,然后點(diǎn)擊“生成”標(biāo)簽,在“輸出”區(qū)域勾選 XML文檔文件即可。每次在生成DLL項(xiàng)目時(shí)就會(huì)多生成一個(gè)同名的XML文件,打開這個(gè)文件可以看到里面全部是DLL當(dāng)中的注釋內(nèi)容了(只包含\\\的注釋)。從這里也可以看出,智能感知中看到的代碼注釋其實(shí)就是從XML中讀取相應(yīng)內(nèi)容然后顯示給程序員看。只要XML和DLL在同一文件夾下,VS在導(dǎo)入DLL的時(shí)候會(huì)自動(dòng)將同名的XML也導(dǎo)入進(jìn)來,用戶不必手動(dòng)復(fù)制。
五、其它
在使用DLL的時(shí)候還有一種方法是使用[DLLImport("yourdll.dll")]。這是com組件的使用方式,在VS中微軟不推薦這樣的方式使用DLL。
- 2 回答
- 0 關(guān)注
- 536 瀏覽
添加回答
舉報(bào)
