C DllImport用法和路徑問題

2021-06-06 13:50:44 字數 3729 閱讀 2305

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(

"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);

public

class dllinvoke

~dllinvoke()

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

public delegate invoke(string apiname,type t)

}

下面**進行呼叫

public

delegate

int compile(string command, stringbuilder inf);

//編譯 dllinvoke dll =

@"~/bin/judge.dll

"));

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屬性應用於方法,要求最少要提供包含入口點的dll的名稱。dllimport的定義如下 attributeusage attri...

相對路徑和絕對路徑以及它們的用法

什麼是絕對定位,什麼是相對定位?1.相對引用指引用的檔案相對於,當前位置的所在位置 eg index.php 同一目錄下的index.php檔案 test index.php 同一目錄下的test資料夾下的index.php檔案 2.絕對引用,引用的是絕對位址 eg require once str...

絕對路徑與相對路徑用法

在網頁製作的過程中,少不了跟路徑打交道,比如,包含乙個檔案,插入乙個等,與路徑都有關係,如果使用了錯誤的檔案路徑,就會導致引用失效 無法瀏覽鏈結檔案,或無法顯示插入的等 初學者可能會感到困惑,下面我就詳細的介紹一下相對路徑與絕對路徑。html有2種路徑的寫法 相對路徑和絕對路徑。html相對路徑 r...