PINVOKE.NET: Do interop the wiki way!

原创 2004年06月29日 12:37:00

PINVOKE.NET: Do interop the wiki way!


Updated on Friday, October 29, 2004

Writen by Allen Lee

首先什么是PInvoke呢?PInvoke是Platform invoke的缩写。我们先来看看MSDN文档中的解释:

Platform invoke is a service that enables managed code to call unmanaged functions implemented in dynamic link libraries (DLLs), such as those in the Win32 API.

很明显,PInvoke是为了让我们能够调用现有的本机代码,而这些代码是以二进制DLL的形式存在的。微软意识到这种交互的重要性,也深知开发人员不可能丢弃所有已存在的东西直接转向.NET,于是在.NET里面加入了PInvoke这个特性。

那么,什么又是PINVOKE.NET呢?我们来看看官方网站上面的这句话:

Think of this as the 21st century version of VB6's API Text Viewer.

用过VB6的朋友应该对那个API Text Viewer不陌生了吧!在VB6的时代,要调用那些Win32 API函数,就需要用到这个东东。然而在.NET时代却没有一个类似的东西吗?当然,现在你知道这个问题的答案了——PINVOKE.NET。或许,你还发现在它的官方网站上面,我们还可以看到一个很醒目的标语:

Do interop the wiki way!

好吧,赶快下载一个PINVOKE.NET并且安装好,这个步骤的细节我就不啰嗦了。有几点要提醒的,PINVOKE.NET是以插件的形式插入Visual Studio .NET的,所以,前提是,你必须有Visual Studio .NET的其中一个版本,这里用Visual C# .NET来做示范。

首先介绍一下这次的示范项目,它是一个叫做PInvokeLab的ConsoleApplication Project,我们将会调用MessageBox(...)这个API来向用户说声“Hello, PINVOKE.NET!”。现在就让我们来感受一下怎么Do interop the wiki way!

在你需要插入Win32API Signature(有人把它翻译成签名,有人把它翻译成型构,我看我还是用回原文)的地方单击鼠标右键,有没有留意到这个弹出的菜单顶部多了两项?没错,这两项就是PINVOKE.NET插到Visual Studio .NET的东西:“Insert PInvoke Signatures...”和“Contribute PInvoke Signatures and Types...”。

o_PInvokeMenu.JPG

接着选择“Insert PInvoke Signatures...”,得到下面的对话框。

o_PInvokeMain.JPG

在“What function do you need?”那里写入“MessageBox”,按下右边的[Go]按钮,PINVOKE.NET将会自动连接到www.pinvoke.net的数据库查找数据。

o_PInvokeConnecting.JPG

查找完毕就会返回结果。

o_PInvokeResult.JPG

在这个带有结果的截图上,我们可以看到很多东西。第一,有MessageBox的简要介绍,包括功能以及参数的介绍(英文的)。第二,MessageBox的Signature的最后更新日期。第三,将要插入到你的源代码的代码片断。第四,编程语言的选择,由于这里使用C#,所以它将给出C#样式的Signature。不过笔者特意另外创建一个VB.NET的Project,发现它不能以VB.NET的语法样式插入相应的Signature,不知道它是否偏心C#,希望它在将来的版本有所改进,让更多的开发者受益。第五,左下角那里,给出提供类似或相同功能的Managed API作为使用建议,如果有的话,这里是System.Windows.Forms.MessageBox.Show()。

接着,你检查一下,没问题就按下[Insert]键。

o_PInvokeInserted.JPG

它将提示你代码已经被插入了,现在你可以按[Close]回到原源代码那里,并整理一下代码的缩进等。整理后的代码如下:

 

None.gifusing System;
None.gif
using System.Runtime.InteropServices;
None.gif
None.gif
namespace PInvokeLab
ExpandedBlockStart.gif
{
InBlock.gif    
class Tester
ExpandedSubBlockStart.gif    
{
InBlock.gif        [STAThread]
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gif        
{
InBlock.gif            MessageBox(
0"Hello, PInvoke.NET""PInvokeLab"0);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        [DllImport(
"user32.dll", CharSet=CharSet.Auto)]
InBlock.gif        
public static extern int MessageBox(int hWnd, String text, String caption, uint type);
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

 

现在编译该代码并查看一下运行结果:

o_PInvokeLab.JPG

好吧,说到现在应该怎么做你也应该很清楚的了,还不赶快Do interop the wiki way!?

最后要对PINVOKE.NET补充一下,菜单的另外一项是指你自己对Win32API描述的Signature上传到www.pinvoke.net的数据库。另外,你也可以去官方那里查看相关的Win32API的说明,这些说明大部分都包括Signature、参数信息、示范例子、可选Managed API建议等(英文),当然你也可以去参考其他的文献,例如MSDN Library。有时候你可能发现某些PInvoke的调用失灵,例如ExitWindowsEx(...),不用慌张,你查看该函数的文档的时候会发现调用该函数还需要一些Windows安全措施例如权限制定等,所以,在你调用Win32API之前,首先得确定调用条件,否则程序可能会有莫名其妙的运行效果。还有一点要提醒的,虽然使用PInvoke可以调用Win32API,但这是需要牺牲一些运行时性能的,所以如果有对应的Managed API的话,我建议你还是选用Managed API。

 

Libevent源码分析-----通用类型和函数

转载请注明出处:http://blog.csdn.net/luotuo44/article/details/38780157         Libevent定义了一系列的可移植的兼...
  • kingbrant
  • kingbrant
  • 2017年06月06日 21:15
  • 103

杭电 HDU ACM 2612 Find a way (简单两路广搜)

欢迎参加——每周六晚的BestCoder(有米!) Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/...
  • lsgqjh
  • lsgqjh
  • 2015年07月31日 09:47
  • 1526

C#学习日记2017-04-22 NPOI用法小结(未完待续)

NPOI基础认识NPOI:NPOI能够在用户没有安装office情况下仍然能够操作office对象,是POI 的.net版本。可支持的文件格式有.xls .doc .ppt等。在大多数要运用到Exc...
  • yeyoushen000000
  • yeyoushen000000
  • 2017年04月22日 09:09
  • 727

Wiki语法快速参考

Wiki语法快速参考 for more ---- = 创建水平线. \\ = 换行, \\\=force line break and clear. [link] ...
  • cn_cainiao
  • cn_cainiao
  • 2014年07月28日 15:10
  • 10987

杭电-2612 Find a way(广搜)

Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • lu_1110
  • lu_1110
  • 2016年07月30日 09:46
  • 190

hdu Find a way(两路广搜)

Find a way Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo...
  • blessLZH0108
  • blessLZH0108
  • 2016年12月23日 20:11
  • 379

如何搭建自己的wiki

wiki的中立和版权很重要,自己搭建?难.在中国?更难!自己闹着玩吧 Wiki 是一个协同著作平台或称开放编辑系统。所谓协同工作, 即它能够让浏览网页的人都能够去修订网页,其简介的 ... Wiki...
  • lhf_tiger
  • lhf_tiger
  • 2015年03月03日 15:50
  • 20346

如何进行个人wiki写作

Wiki是一种内容管理系统,它的特点包括:多人协作模式、内容逐步积累、网状知识链接。而用作个人知识管理的个人wiki,就利用了内容逐步积累和网状知识链接这两个特点。因为是个人的,所以用不着协作。 ...
  • novelly
  • novelly
  • 2014年01月19日 21:30
  • 2577

Wiki管理工具生成器

现在,越来越多的企业和组织开始在他们的局域网里部署企业Wiki,其中不乏一些著名公司如Adobe System,英特尔(Intel),微软(Miscrosoft),印弗瑟斯(Infosys),甚至美国...
  • lchmyhua88
  • lchmyhua88
  • 2016年08月10日 16:48
  • 439

C# interopservice之默认封组行为

参见default marshaling behaviour interop封组器(marshaler)的内存管理 interop封组器总是会试图去释放由非托管代码分配的内存。这个行为和COM内存管...
  • kfqcome
  • kfqcome
  • 2013年08月21日 18:12
  • 1819
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PINVOKE.NET: Do interop the wiki way!
举报原因:
原因补充:

(最多只允许输入30个字)