位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

調(diào)用DLL中的非托管函數(shù)一般方法

提問人:劉冬梅發(fā)布時間:2020-10-12

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

[DLLImport(“DLL文件”)]

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

其中:

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

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

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

方法名稱:在DLL文件中你需調(diào)用方法的名稱。

參數(shù)列表:在DLL文件中你需調(diào)用方法的列表。

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

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

DLL文件必須位于程序當(dāng)前目錄或系統(tǒng)定義的查詢路徑中(即:系統(tǒng)環(huán)境變量中Path所設(shè)置的路徑)。

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

若要使用其它函數(shù)名,可以使用EntryPoint屬性設(shè)置,如:

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

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

其它可選的 DllImportAttribute 屬性:

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

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

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

PreserveSig指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換, 如:PreserveSig=true;

CallingConvention指示入口點(diǎn)的調(diào)用約定, 如:CallingConvention=CallingConvention.Winapi;

此外,關(guān)于“數(shù)據(jù)封送處理”及“封送數(shù)字和邏輯標(biāo)量”請參閱其它一些文章[2]。

C#例子:

1. 啟動VS.NET,新建一個項(xiàng)目,項(xiàng)目名稱為“Tzb”,模板為“Windows 應(yīng)用程序”。

2. 在“工具箱”的“ Windows 窗體”項(xiàng)中雙擊“Button”項(xiàng),向“Form1”窗體中添加一個按鈕。

3. 改變按鈕的屬性:Name為 “B1”,Text為 “用DllImport調(diào)用DLL彈出提示框”,并將按鈕B1調(diào)整到適當(dāng)大小,移到適當(dāng)位置。

4. 在類視圖中雙擊“Form1”,打開“Form1.cs”代碼視圖,在“namespace Tzb”上面輸入“using System.Runtime.InteropServices;”,以導(dǎo)入該命名空間。

5. 在“Form1.cs[設(shè)計]”視圖中雙擊按鈕B1,在“B1_Click”方法上面使用關(guān)鍵字 static 和 extern 聲明方法“MsgBox”,將 DllImport 屬性附加到該方法,這里我們要使用的是“user32.dll”中的“MessageBoxA”函數(shù),具體代碼如下:

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

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

然后在“B1_Click”方法體內(nèi)添加如下代碼,以調(diào)用方法“MsgBox”:

MsgBox(0," 這就是用 DllImport 調(diào)用 DLL 彈出的提示框哦! "," 挑戰(zhàn)杯 ",0x30);

6. 按“F5”運(yùn)行該程序,并點(diǎn)擊按鈕B1,便彈出如下提示框:

image.png

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部