在Visual Studio寫cs檔案,調用非託管的win32 api要用到DllImport ,比如
1 using System;
2 using System.Runtime.InteropServices;
3
4 class Example
5 {
6 // Use DllImport to import the Win32 MessageBox function.
7 [DllImport("user32.dll", CharSet = CharSet.Auto)]
8 public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
9
10 static void Main()
11 {
12 // Call the MessageBox function using platform invoke.
13 MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
14 }
15 }
16
我常常有這樣問題:
DllImport和public static這2行中最重要的部分要手動敲進去,比如函數名MessageBox和參數列表(IntPtr hWnd, String text, String caption, uint type),為什麼強大的Visual Studio不能自動完成?
我覺得如果Visual Studio做的比較人性化的話,應該這樣:
在*.cs檔案上點擊右鍵,出來菜單“調用win api”或“DllImport”,彈出dll檔案選擇視窗(這裡可以把常用win32 dll列出來,免得去system32裡找),選擇dll檔案,確定,彈出dll的函數列表,每個函數名前面有個checkbox,選中checkbox,確定,自動將
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
插入到cs檔案的頭部,並且自動把函數的參數列錶轉換成csharp類型且填寫完成,多爽,為什麼ms沒做,不應該是沒想到。擷取函數名可以使用 dumpbin /exports user32.dll 或 link /dump /exports user32.dll 命令。
最令我比較煩惱的是參數列表和參數類型。假如第三方廠商丟給你一個crypt.dll,沒有文檔,老闆讓你用c#調用crypt.dl實現產品的部分功能,即使我用了dumpbin 擷取了函數列表,但是我不知道參數啊,是不是就無法完成了?還有,假如有些函數參數不是c#的基礎資料型別 (Elementary Data Type),是不是也沒辦法做?大家說說看。
本人菜鳥不才,請園友不吝賜教。