2010年3月23日 星期二

在C#中使用Unmanagement函式(DllImport)

要在Management程式(.net程式)中使用舊有的Unmanagement函式,例如User32裡面的API,需要使用DllImport來做轉換,最單純的用法就像在在WPF中取得螢幕的解析度中使用的GetSystemMetrics

[DllImport("user32.dll")]
static extern int GetSystemMetrics(int nIndex);

這裡僅需要知道這個函式寫在哪個dll,以及傳入傳出的參數形態就可以
簡單的形態轉換可以參考Managed and Un-Managed Code in .NET

在這邊有幾個可以注意的地方
第一個是可以做函式名稱的轉換(為了統一命名規則之類的原因)

[DllImport("user32.dll") EntryPoint="GetSystemMetrics")]
static extern int gsm(int nIndex);

依照這樣的寫法就可以用一個gsm的函式呼叫原本在User32中叫做GetSystemMetrics的函式

另一個是如果回傳是BOOLEAN的型別,則需要用MarshalAs來轉換,例如

BOOLEAN BoolFunction();

就需要寫成

[DllImport("a.dll")]
[return: MarshalAs(UnmanagedType.U1)]
static bool BoolFunction();


--
參考資料
請以 MarshalAs 標記布林 P/Invoke 引數
指定進入點
Managed and Un-Managed Code in .NET
UnmanagedType 列舉型別

沒有留言:

張貼留言