c 的dllimport使用方法詳解

2021-07-08 17:24:16 字數 3742 閱讀 9136

dllimport是system.runtime.interopservices命名空間下的乙個屬性類,其功能是提供從非託管dll匯出的函式的必要呼叫資訊

dllimport屬性應用於方法,要求最少要提供包含入口點的dll的名稱。

dllimport的定義如下:

[attributeusage(attributetargets.method)]

public class dllimportattribute: system.attribute

//定位引數為dllname

public callingconvention callingconvention; //入口點呼叫約定

public charset charset; //入口點採用的字元接

public string entrypoint; //入口點名稱

public bool exactspelling; //是否必須與指示的入口點拼寫完全一致,預設false

public bool preservesig; //方法的簽名是被保留還是被轉換

public bool setlasterror; //findlasterror方法的返回值儲存在這裡

public string value }

}

用法示例:

[dllimport("kernel32")]

private static extern long writeprivateprofilestring(string section,string key,string val,string filepath);

以上是用來寫入ini檔案的乙個win32api。用此方式呼叫win32api的資料型別對應:dword=int或uint,bool=bool,預定義常量=enum,結構=struct。

dllimport會按照順序自動去尋找的地方:

1、exe所在目錄

2、system32目錄

具體做法如下:

首先我們在伺服器上隨便找個地方新建乙個目錄,假如為c:\dll  然後,在環境變數中,給path變數新增這個目錄  最後,把所有的非託管檔案都拷貝到c:\dll中.  或者更乾脆的把dll放到system32目錄  對於可以自己部署的應用程式,這樣未償不是乙個解決辦法,然而,如果我們用的是虛擬空間,我們是沒辦法把註冊path變數或者把我們自己的dll拷到system32目錄的。同時我們也不一定知道我們的dll的物理路徑。  

[dllimport("kernel32.dll")]

private extern static intptr loadlibrary(string path);

[dllimport("kernel32.dll")]

private extern static intptr getprocaddress(intptr lib, string funcname);

[dllimport("kernel32.dll")]

private extern static bool freelibrary(intptr lib);

分別取得了loadlibrary和getprocaddress函式的位址,再通過這兩個函式來取得我們的dll裡面的函式。

以下自定義類的**完成loadlibrary的裝載和函式呼叫

public class dllinvoke

~dllinvoke()

//將要執行的函式轉換為委託

public delegate invoke(string apiname,type t)

}

下面**進行呼叫

public delegate int compile(string command, stringbuilder inf);

//編譯

compile compile = (compile)dll.invoke("compile", typeof(compile));

stringbuilder inf;

compile(@「gcc a.c -o a.exe「,inf);//這裡就是呼叫我的dll裡定義的compile函式

大家在實際工作學習c#的時候,可能會問:為什麼我們要為一些已經存在的功能(比如windows中的一些功能,c++中已經編寫好的一些方法)要重新編寫**,c#有沒有方法可以直接都用這些原本已經存在的功能呢?答案是肯定的,大家可以通過c#中的dllimport直接呼叫這些功能。   

dllimport所在的名字空間 using system.runtime.interopservices;   

msdn中對dllimportattribute的解釋是這樣的:可將該屬性應用於方法。dllimportattribute 屬性提供對從非託管 dll

匯出的函式進行呼叫所必需的資訊。作為最低要求,必須提供包含入口點的 dll 的名稱。    dllimport 屬性定義如下:

namespace system.runtime.interopservices  

public callingconvention callingconvention;

public charset charset;  

public string entrypoint;  

public bool exactspelling;  

public bool preservesig;    

public bool setlasterror;  

public string value }  

} }

說明:    

1、dllimport只能放置在方法宣告上。

2、dllimport具有單個定位引數:指定包含被匯入方法的 dll 名稱的

dllname 引數。    

3、dllimport具有五個命名引數:

a、callingconvention

引數指示入口點的呼叫約定。如果未指定 callingconvention,則使用預設值

callingconvention.winapi。

b、charset 引數指示用在入口點中的字符集。如果未指定 charset,則使用預設值

charset.auto。       

c、entrypoint 引數給出 dll 中入口點的名稱。如果未指定

entrypoint,則使用方法本身的名稱。         

d、exactspelling 引數指示 entrypoint

是否必須與指示的入口點的拼寫完全匹配。如果未指定 exactspelling,則使用預設值 false。         

e、preservesig

引數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為乙個具有 hresult返回值和該返回值的乙個名為 retval

的附加輸出引數的簽名。如果未指定 preservesig,則使用預設值 true。         

f、setlasterror 引數指示方法是否保留

win32"上一錯誤"。如果未指定 setlasterror,則使用預設值 false。       

4、它是一次性屬性類。       

5、此外,用 dllimport 屬性修飾的方法必須具有 extern 修飾符。

c 的dllimport使用方法詳解

dllimport是system.runtime.interopservices命名空間下的乙個屬性類,其功能是提供從非託管dll匯出的函式的必要呼叫資訊 dllimport是system.runtime.interopservices命名空間下的乙個屬性類,其功能是提供從非託管dll匯出的函式的必...

C 中的DllImport使用筆記

using system.runtime.interopservices dllimport kernel32 private static extern intgetprivateprofilestring string section,string key,string def,stringbu...

C 中使用DllImport呼叫C dll

為什麼要在c 中呼叫c 的 呢?比如我有乙個c 專案要實現某種功能,同時我恰好有乙個已經實現了這個功能的c 我可以用c 重寫一遍,當然如果工程比較大的話,用dllimport來呼叫c 的dll是乙個更好的選擇。由於c dll是非託管 我不能直接在c 工程中新增引用 會出錯誤提示 命名空間system...