分享
 
 
 

PINVOKE.NET: Do interop the wiki way!

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本专题主要介绍Allen Lee在平时的工作和学习中遇到的好的.NET工具,并讲述相关的使用经验。工欲善其事,必先利其器。那么,现在就让我们看看有什么器可以利吧!

3. PINVOKE.NET

首先什么是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...”。

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

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

查找完毕就会返回结果。

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

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

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

using System;

using System.Runtime.InteropServices;

namespace PInvokeLab

{

class Tester

{

[STAThread]

static void Main(string[] args)

{

MessageBox(0, "Hello, PInvoke.NET", "PInvokeLab", 0);

}

[DllImport("user32.dll", CharSet=CharSet.Auto)]

public static extern int MessageBox(int hWnd, String text, String caption, uint type);

}

}

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

好吧,说到现在应该怎么做你也应该很清楚的了,还不赶快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。

可以问你一个问题吗?当你看完这篇介绍后,你有没有想过使用这个工具?有多想?能给我一个回复么?(完全没兴趣、感觉无所谓、有机会可以一试、马上去下载一个看看)谢谢!

Allen Lee

See also:

Reflector: Get the secret inside .NET assemblies

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有