C 呼叫非託管DLL函式

2021-05-02 18:10:50 字數 4822 閱讀 2183

demo

#region

c#捕獲當前螢幕的例子

using

system ; 

using

system.drawing ; 

using

system.collections ; 

using

system.componentmodel ; 

using

system.windows.forms ; 

using

system.data ; 

using

system.drawing.imaging ; 

public

class

form1 : form 

//清除程式中使用過的資源 

protected

override

void

dispose ( 

bool

disposing ) 

}base

.dispose ( disposing ) ; 

}private

void

initializecomponent ( ) 

//宣告乙個api函式 

[ system.runtime.interopservices.dllimportattribute ( 

"gdi32.dll

") ] 

private

static

extern

bool

bitblt ( 

intptr hdcdest , 

//目標 dc的控制代碼 

intnxdest , 

intnydest , 

intnwidth , 

intnheight , 

intptr hdcsrc , 

//源dc的控制代碼 

intnxsrc , 

intnysrc , 

system.int32 dwrop 

//光柵的處理數值 

) ; 

static

void

main ( ) 

newform1 ( ) ) ; 

}private

void

button1_click ( 

object

sender , system.eventargs e ) 

}#endregion

上面的例子中,應用c#呼叫非託管dll的函式如下:

//宣告乙個api函式 

[ system.runtime.interopservices.dllimportattribute ( 

"gdi32.dll

") ] 

private

static

extern

bool

bitblt ( 

intptr hdcdest , 

//目標 dc的控制代碼 

intnxdest , 

intnydest , 

intnwidth , 

intnheight , 

intptr hdcsrc , 

//源dc的控制代碼 

intnxsrc , 

intnysrc , 

system.int32 dwrop 

//光柵的處理數值 

) ;

c# 如何使用 dllimport attribute(屬性) 標識 dll 和函式

system.runtime.interopservices.dllimportattribute

從託管**中訪問非託管 dll 函式之前,需要知道該函式的名稱以及該 dll 的名稱,然後為 dll 的非託管函式 編寫 託管定義。

它將用到 static 和 extern 修飾符,此型別的公共靜態成員對於多執行緒操作是安全的。

dllimport 屬性提供非託管 dll 函式的呼叫資訊。

示例1  簡單dllimportattribute 應用

using

system.runtime.interopservices;

[dllimport(

"user32.dll

")]     

public

static

extern

intmessagebox(

inthwnd, string text, string caption, 

uint

type);

示例2  如何將 dllimportattribute 應用於方法。

using

system.runtime.interopservices;

[dllimport(  

"kernel32.dll", 

entrypoint="

movefilew", 

setlasterror

=true

, charset

=charset.unicode, 

exactspelling

=true

, callingconvention

=callingconvention.stdcall)]

public

static

extern

bool

movefile(string src, string dst);

引數說明:

entrypoint         指定要呼叫的 dll 入口點。

setlasterror       判斷在執行該方法時是否出錯(使用 marshal.getlastwin32error api 函式來確定)。

c#中預設值為 false。

charset            控制名稱及函式中字串引數的編碼方式。預設值為 charset.ansi。

exactspelling      是否修改入口點以對應不同的字元編碼方式。

callingconvention  指定用於傳遞方法引數的呼叫約定。預設值為 winapi。

該值對應於基於32位intel平台的 __stdcall。

c# 關鍵字 extern 的使用

public static extern int mymethod(int x);

外部修飾符 extern 用於指示外部實現方法,常與 dllimport 屬性一起使用(dllimport 屬性提供非託管 dll 函式的呼叫資訊)。

若將 abstract 和 extern 修飾符一起使用來修改同一成員是錯誤的。extern 將方法在 c# **的外部實現,而 abstract 意味著在此類中未提供此方法的實現。

因為外部方法宣告不提供具體實現,所以沒有方法體;

此方法宣告只是以乙個分號結束,並且在簽名後沒有大括號。

示例3  接收使用者輸入的字串並顯示在訊息框中

程式從 user32.dll 庫匯入的 messagebox 方法。

using

system;

using

system.runtime.interopservices;

class

myclass }

執行結果: 輸入"hello"文字後,螢幕上將彈出乙個包含該文字的訊息框。

enter your message: hello

示例4  呼叫dll進行計算 

該示例使用兩個檔案 cm.cs 和 cmdll.c 來說明 extern。

c 檔案是從 c# 程式中呼叫的外部 dll。

使用 visual c++ 命令行將 cmdll.c 編譯為 dll:

cl /ld /md cmdll.c

檔案:cmdll.c

//cmdll.c

//compile with: /ld /md

int__declspec(dllexport) mymethod(

inti)

使用命令列編譯 cm.cs:

csc cm.cs

這將建立可執行檔案 cm.exe。

檔案:cm.cs //

cm.cs

using

system;

using

system.runtime.interopservices;

public

class

myclass ."

, mymethod(

5));}}

執行此程式,mymethod 將值 5 傳遞到 dll 檔案,該檔案將此值乘以 10 返回。

執行結果:mymethod() returns 50.

intptr 型別的說明

對於平台呼叫,應讓引數為 intptr 型別,而不是 string 型別。使用 system.runtime.interopservices.marshal 類所提供的方法,可將型別手動轉換為字串並手動將其釋放。

intptr 型別被設計成整數,其大小適用於特定平台。

在 32 位硬體和作業系統中將是 32 位;

在 64 位硬體和作業系統中將是 64 位。

intptr 型別由支援指標的語言使用,並作為在支援與不支援指標的語言間引用資料的一種通用方式。它也可用於保持控制代碼。例如,intptr 的例項廣泛地用在 system.io.filestream 類中來保持檔案控制代碼。

intptr 型別符合 cls,而 uintptr 型別卻不符合。只有 intptr 型別可用在公共語言執行庫中。此型別實現 iserializable 介面。

C 呼叫託管DLL與非託管DLL

dll之前使用過幾次,但是最近使用時,又出各種問題。最後弄到晚上十二點多了,看到網上乙個建立dll的 教程,按上面的講解,成功實現了c 呼叫自己建立的dll。之所以耗了這麼久時間,是因為我本想憑自己記憶實現dll建立呼叫,但是各種問題隨即產生。不說了,割了 今天上午再次整理,覺得有必要記錄。c 呼叫...

c 託管非託管Dll動態呼叫

最近經常看到有人問託管非託管dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath 這裡...

託管呼叫非託管的DLL

dllimport createnewprocess.dll charset charset.unicode public static extern bool createprocess marshalas unmanagedtype.lpwstr string fullpath 以上是定義入口,...