(二) 動態裝載、調用DLL中的非託管函數函數
在上面已經說明了如何用DllImport調用DLL中的非託管函數,可是這個是全局的函數,倘若DLL中的非託管函數有一個靜態變量S,每次調用這個函數的時候,靜態變量S就自動加1。結果,當須要從新計數時,就不能得出想要的結果。下面將用例子說明:設計
1. DLL的建立orm
1) 啓動Visual C++ 6.0;it
2) 新建一個「Win32 Dynamic-Link Library」工程,工程名稱爲「Count」;編譯
3) 在「Dll kind」選擇界面中選擇「A simple dll project」;變量
4) 打開Count.cpp,添加以下代碼:
// 導出函數,使用「 _stdcall 」 標準調用bug
extern "C" _declspec(dllexport)int _stdcall count(int init);程序
int _stdcall count(int init)方法
{//count 函數,使用參數 init 初始化靜態的整形變量 S ,並使 S 自加 1 後返回該值im
static int S=init;
S++;
return S;
}
5) 按「F7」進行編譯,獲得Count.dll(在工程目錄下的Debug文件夾中)。
2. 用DllImport調用DLL中的count函數
1) 打開項目「Tzb」,向「Form1」窗體中添加一個按鈕。
2) 改變按鈕的屬性:Name爲 「B2」,Text爲 「用DllImport調用DLL中count函數」,並將按鈕B1調整到適當大小,移到適當位置。
3) 打開「Form1.cs」代碼視圖,使用關鍵字 static 和 extern 聲明方法「count」,並使其具備來自 Count.dll 的導出函數count的實現,代碼以下:
[DllImport("Count.dll")]
static extern int count(int init);
4) 在「Form1.cs[設計]」視圖中雙擊按鈕B2,在「B2_Click」方法體內添加以下代碼:
MessageBox.Show(" 用 DllImport 調用 DLL 中的 count 函數, n 傳入的實參爲 0 ,獲得的結果是: "+count(0).ToString()," 挑戰杯 ");
MessageBox.Show(" 用 DllImport 調用 DLL 中的 count 函數, n 傳入的實參爲 10 ,獲得的結果是: "+count(10).ToString()+"n 結果可不是想要的 11 哦!!! "," 挑戰杯 ");
MessageBox.Show(" 所得結果代表: n 用 DllImport 調用 DLL 中的非託管 n 函數是全局的、靜態的函數!!! "," 挑戰杯 ");
5) 把Count.dll複製到項目「Tzb」的binDebug文件夾中,按「F5」運行該程序,並點擊按鈕B2,便彈出以下三個提示框:
第1個提示框顯示的是調用「count(0)」的結果,第2個提示框顯示的是調用「count(10)」的結果,由所得結果能夠證實「用DllImport調用DLL中的非託管函數是全局的、靜態的函數」。因此,有時候並不能達到咱們目的,所以咱們須要使用下面所介紹的方法:C#動態調用DLL中的函數。