利用P/Invoke Interop Assistant写一个最简单的CLR程序

来自: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

你可能感兴趣的:(利用P/Invoke Interop Assistant写一个最简单的CLR程序)