2 回答

TA貢獻1895條經(jīng)驗 獲得超7個贊
C#不能寫你說的那種DLL,C#寫的DLL只是個類庫,不是標準DLL.
你說的那是標準DLL.入口函數(shù)是DllMain函數(shù)
補充:如果是標準DLL,C#無能為力.
都跟你說了C#寫的DLL不是標準DLL.只是個類庫.所以不可能用LoadLibrary來調(diào)用.
你既然已經(jīng)注入了,可以用反射來實現(xiàn)調(diào)用
你可以通過Assembly.LoadFrom(路徑)這個函數(shù)來加載C#的DLL.這樣加載的DLL和Library加載的是一樣的,都是注入所有進程空間的.
Assembly assembly = Assembly.LoadFrom(strValue);
然后得到這個assembly之后.可以得到這個加載DLL類的所有,比如類的構(gòu)造函數(shù)
Type tmpType = assembly.GetType(dataType);
ConstructorInfo objConstructor = type.GetConstructor(System.Type.EmptyTypes);
然后通過objConstructor 構(gòu)造類的對象
if (objConstructor != null)
{
objDataAccess = (IDataAccess)objConstructor.Invoke(null);//調(diào)用構(gòu)造
}
得到具體對象之后可以通過對象的InvokeMethod來調(diào)用具體的方法

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