国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#程序實現動態調用非托管的DLL文件

2019-11-17 04:00:02
字體:
來源:轉載
供稿:網友
最近做了個項目用到了vc的dll,但是又需要在.net中調用,研究了下c#調用非托管的dll

先介紹一下dll文件

一.Dll文件  

動態鏈接庫(也稱為DLL,即為“Dynamic Link Library”的縮寫)是Microsoft Windows最重要的組成要素之一,打開Windows系統文件夾,你會發現文件夾中有很多DLL文件,Windows就是將一些主要的系統功能以DLL模塊的形式實現。

動態鏈接庫是不能直接執行的,也不能接收消息,它只是一個獨立的文件,其中包含能被程序或其它DLL調用來完成一定操作的函數(方法。注:C#中一般稱為“方法”),但這些函數不是執行程序本身的一部分,而是根據進程的需要按需載入,此時才能發揮作用。

DLL只有在應用程序需要時才被系統加載到進程的虛擬空間中,成為調用進程的一部分,此時該DLL也只能被該進程的線程訪問,它的句柄可以被調用進程所使用,而調用進程的句柄也可以被該DLL所使用。在內存中,一個DLL只有一個實例,且它的編制與具體的編程語言和編譯器都沒有關系,所以可以通過DLL來實現混合語言編程。DLL函數中的代碼所創建的任何對象(包括變量)都歸調用它的線程或進程所有。

二、      DLL的調用

每種編程語言調用DLL的方法都不盡相同,在此只對用C#調用DLL的方法進行介紹。首先,您需要了解什么是托管,什么是非托管。一般可以認為:非托管代碼主要是基于win 32平臺開發的DLL,activeX的組件,托管代碼是基于.net平臺開發的。

(一)    調用DLL中的非托管函數一般方法

首先,應該在C#語言源程序中聲明外部方法,其基本形式是:

[DLLImport(“DLL文件”)]

修飾符extern返回變量類型方法名稱(參數列表)

其中:

DLL文件:包含定義外部方法的庫文件。

修飾符:訪問修飾符,除了abstract以外在聲明方法時可以使用的修飾符。

返回變量類型:在DLL文件中你需調用方法的返回變量類型。

方法名稱:在DLL文件中你需調用方法的名稱。

參數列表:在DLL文件中你需調用方法的列表。

注意:需要在程序聲明中使用System.Runtime.InteropServices命名空間。

      DllImport只能放置在方法聲明上。

DLL文件必須位于程序當前目錄或系統定義的查詢路徑中(即:系統環境變量中Path所設置的路徑)。

返回變量類型、方法名稱、參數列表一定要與DLL文件中的定義相一致。



若要使用其它函數名,可以使用EntryPoint屬性設置,如:

[DllImport("user32.dll", EntryPoint="MessageBoxA")]

static extern int MsgBox(int hWnd, string msg, string caption, int type);

其它可選的DllImportAttribute屬性:

CharSet指示用在入口點中的字符集,如:CharSet=CharSet.Ansi;

SetLastError指示方法是否保留Win32"上一錯誤",如:SetLastError=true;

ExactSpelling指示EntryPoint是否必須與指示的入口點的拼寫完全匹配,如:ExactSpelling=false;

PReserveSig指示方法的簽名應當被保留還是被轉換,如:PreserveSig=true;

CallingConvention指示入口點的調用約定,如:CallingConvention=CallingConvention.Winapi;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上犹县| 康平县| 沛县| 四子王旗| 湘潭市| 逊克县| 康平县| 中江县| 手机| 波密县| 正镶白旗| 扎赉特旗| 巴林右旗| 嘉义市| 高雄县| 从江县| 新民市| 台中县| 南城县| 宜兰市| 海城市| 丹寨县| 淮北市| 黔西| 东乌珠穆沁旗| 保山市| 法库县| 台州市| 孝感市| 西和县| 商丘市| 仙居县| 阳山县| 张家港市| 思南县| 岑溪市| 无极县| 金昌市| 东乡族自治县| 天峻县| 南陵县|