来自:http://hi.baidu.com/wingingbob/item/50f395139514ebe55f53b156
利用P/Invoke Interop Assistant写一个最简单的CLR程序
刚刚听过MSDN Webcast关于P/invoke的讲座,讲师张羿做了一个最简单的调用 user32.dll 的 MessageBox 函数的范例。让我想起当年学VB6时的API调用,是一个道理。记得那时候就有一个 API 辅助查询工具,P/Invoke Interop Assistant 与那个功能类似,使用它就不必自己去查找 MSDN 或者程序的头文件信息了,甚至不必自己去写诸如 DllImport、DllImportAttribute 这样的语句。直接查找需要的 API,然后生成代码粘到 .NET 工程里就是了。当然,对于外部DLL函数调用,还是需要手写的。
这个工具很早前就存在,至今只有英文版本,是个非常小的工具。
下载网址:http://msdn.microsoft.com/en-us/magazine/cc164193.aspx
或者直接点击这里下载:CLRInsideOut2008_01.exe
运行解压后执行 winsiggen.exe 就可以了,如下图:
把找到的函数代码和常量代码复制到 .NET 工程里,如下图:
在Main函数里写上测试代码,运行下就出现了,是不是很方便?
呵呵~~ 从图片上看代码不清晰,下面是自己写一个简单的 user32.dll 的 MessageBox 调用:
using System;
using System.Text;
using System.Runtime.InteropServices; //引入 InteropServices 命名空间
namespace ConsoleApplication1
{
class MyPinvoke
{
[DllImport("user32.dll", EntryPoint = "MessageBox")]
public static extern int MessageBox(IntPtr hwnd, string text, string caption, uint type);
public const int MB_OK = 0; //type的常量 MB_OK=0 显示一个只有“确定”按钮的消息框
}
class Program
{
static void Main(string[] args)
{
MyPinvoke.MessageBox(IntPtr.Zero, "Hello world.", "P/Invoke", MyPinvoke.MB_OK);
}
}
}
注意这个例子,为了简便,调用的是 user32.dll 的 MessageBox 函数,而并不是上图在VS中调用 MessageBoxW 函数,但最终的运行结果与上图相同。
#Dotnet