调用system.runtime.interopservice,可以用dllimport;
API函数主要在“kernel32.dll”、“user32.dll”、“GDI32.dll”,
kernel32.dll,以调用它下面的LoadLibrary、GetProcAddress、FreeLibrary。查MSDN了解了三个函数的原型为:
HMODULE LoadLibrary(LPCTSTR lpFileName);
FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);
BOOL FreeLibrary(HMODULE hModule);
LoadLibrary需要的参数为要调用的DLL文件的名字,而它的返回值为这个DLL文件的句柄;
GetProcAddress需要的参数一个为要调用的DLL的句柄,这个值
由LoadLibrary的返回值提供,另一个参数为要调用该DLL文件中函数的名字。它的返回值为函数的指针;
FreeLibrary需要的参数为调用的函数DLL文件的句柄,返回值为布尔型。
note:查看api函数可使用vs的 dumpbin.exe
简单来讲,IntPtr是一个Struct类型的指针的wrapper结构,是不同编程语言之间类型转换的处理代理。
Marshal:中译空军司令,是远程对象的管理类,有各种操作可供选择。
//字符串参数为IntPtr
[DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, IntPtr text, IntPtr caption, uint type);
void Main()
{
//字符串
var str = "hehe";
//在非托管堆中创建指针
var ptr = Marshal.StringToHGlobalAnsi(str);
//平台调用MessageBoxA interactive pointer==intptr,uint 1,2,messagebox type;
MessageBox(0, ptr, IntPtr.Zero, 2);
//清理
Marshal.FreeHGlobal(ptr);
}
// Define other methods and classes here