C# [ImportDll()] 知識(shí)小結(jié)
這周在做公司的一個(gè)C#項(xiàng)目中,要寫一個(gè)webservice提供一個(gè)下載方法,之前公司有過(guò),但是要整改,于是這種鳥屎攤子又交給了我,其中一個(gè)密文流的下載中要應(yīng)用我們小組另一伙人用C++寫的四個(gè)dll, 這些DLL是由我們自己編寫的,非.NET 托管,這是一個(gè)麻煩事;
如果用 IDE往工程里add reference時(shí),它會(huì)提示這幾個(gè)dll是沒有注冊(cè)的,不是.NET托管的。好吧,順便補(bǔ)充一下.NET托管和非托管。
具體官方術(shù)語(yǔ)是:
托管DLL就是能夠在公共語(yǔ)言運(yùn)行庫(kù)(Common Language Runtime,簡(jiǎn)稱CLR)中能夠直接引用的,并且擴(kuò)展名為“DLL”的文件。具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非托管DLL就是平常所的動(dòng)態(tài)鏈接庫(kù)等,其中就包括了封裝所有Windows API函數(shù)的DLL文件。各種非托管DLL中的函數(shù)在公共語(yǔ)言運(yùn)行庫(kù)中不能直接被調(diào)用,而需要經(jīng)過(guò).Net框架提供的“平臺(tái)調(diào)用”服務(wù)后才可以。
通俗點(diǎn)講就是:
托管Dll就在.NET環(huán)境生成的Dll文件。
非托管dll不是在.NET環(huán)境生成的dll文件。比如說(shuō)用c寫的,用C++寫的。
托管Dll文件,可以在IDE通過(guò) “add reference” 的方式,直接把托管Dll文件添加到項(xiàng)目中。然后通過(guò) Using Dll命名空間,來(lái)調(diào)用相應(yīng)的Dll對(duì)象 。非托管Dll文件怎么調(diào)用了,這就要用到 [ImportDll()] 這種方法了;
[ImportDll()] 這種方法是通過(guò)P/Iovoke 來(lái)調(diào)用WIN32 API。其作用是導(dǎo)入外部的函數(shù),這些函數(shù)不是由NET托管的。當(dāng)然當(dāng)使用[ImportDll()] 時(shí),必須要引入命名空間:
using System.Runtime.InteropServices;
舉一個(gè)例子
[DllImport(@("DownloadPlaintext.dll",EntryPoint="DownloadPlaintext"))] static extern Boolean FileDownLoad ([MarshalAs(UnmanagedType.LPStr)] StringBuilder pstrSourceFile, [MarshalAs(UnmanagedType.LPStr)] long lintFileSize, bool blnEnFlag)
這個(gè)例子導(dǎo)入的就是一個(gè) C++寫的dll,名字是DownloadPlaintext.dll,這樣寫的是相對(duì)的路徑,所以我們必須要手動(dòng)的把這個(gè)dll文件拷到該項(xiàng)目的bin目錄下對(duì)應(yīng)的release或者Debug目錄中去。否則就會(huì)找不到dll,或者直接將此dll,丟到system32中去,但這樣做是不安全的;
EntryPoint是外部函數(shù) 的入口點(diǎn),可以理解為調(diào)用外部函數(shù)的那個(gè)方法,假設(shè)dll中存在DownloadPlaintext這個(gè)函數(shù)名,而項(xiàng)目中也存在的話,這樣就會(huì)有沖突,所以C#還提供了重定義外部函數(shù)方法名,(并不是該dll中的名字,只是改變其在這個(gè)項(xiàng)目文件中的使用名而已),就像上面的例子一樣,將DownloadPlaintext方法在C#這個(gè)項(xiàng)目的使用名命名為FileDownLoad ,要注意的是參數(shù)要一致,類型要一致;
MarshalAs 是指提供向非托管代碼封裝數(shù)據(jù)時(shí)的規(guī)則,上面告訴net,第一個(gè)參數(shù)要用string 類型,第三個(gè)是bool型;
這里要注意一個(gè)問(wèn)題,剛開始改代碼時(shí),調(diào)試通過(guò)了,一發(fā)到IIS,其他人根本無(wú)法成功調(diào)用這個(gè)方法,我糾結(jié)了半天,后來(lái)才找到原因!
因?yàn)槭窃谇叭嘶A(chǔ)上改代碼,沒注意前人留下的坑,這份代碼的初始者,將dll的引入路徑做成的是絕對(duì)路徑:
[DllImport(@("C:\CloudDll\DownloadPlaintext.dll",EntryPoint="DownloadPlaintext"))]
這樣的話,IIS是無(wú)法去找到這個(gè)路徑的,即使你在C:\CloudDll目錄下有這個(gè)dll,所以,要專業(yè)點(diǎn)...
這個(gè)方法,看似是好簡(jiǎn)單的東西,可是不深究的話是學(xué)不到東西的!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
欄 目:C#教程
下一篇:解析在C#中接口和類的異同
本文標(biāo)題:C# [ImportDll()] 知識(shí)小結(jié)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4947.html
您可能感興趣的文章
- 01-10C#中DataGridView常用操作實(shí)例小結(jié)
- 01-10C#中Winform獲取文件路徑的方法實(shí)例小結(jié)
- 01-10日常收集C#接口知識(shí)(知識(shí)全面)
- 01-10基于C#生成條形碼操作知識(shí)匯總附源碼下載
- 01-10C#隱藏主窗口的方法小結(jié)
- 01-10C#基礎(chǔ)知識(shí)之new關(guān)鍵字介紹
- 01-10C#基礎(chǔ)知識(shí)之this關(guān)鍵字介紹
- 01-10C#基礎(chǔ)知識(shí)之base關(guān)鍵字介紹
- 01-10C#數(shù)組的常用操作方法小結(jié)
- 01-10C#初始化數(shù)組的方法小結(jié)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改