PINVOKE.NET: Do interop the wiki way!

PINVOKE.NET: Do interop the wiki way!

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.gif using System;
None.gif
using System.Runtime.InteropServices;
None.gif
None.gif
namespace PInvokeLab
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
classTester
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif[STAThread]
InBlock.gif
staticvoidMain(string[]args)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifMessageBox(
0,"Hello,PInvoke.NET","PInvokeLab",0);
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif[DllImport(
"user32.dll",CharSet=CharSet.Auto)]
InBlock.gif
publicstaticexternintMessageBox(inthWnd,Stringtext,Stringcaption,uinttype);
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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值