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 以上是定義入口,...