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...”。
接着选择“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.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。
转载于:https://www.cnblogs.com/allenlooplee/archive/2004/10/22/55340.html
PINVOKE.NET: Do interop the wiki way!相关推荐
- 博客园期刊创刊号入选文章
博客园期刊创刊号入选文章 期刊制作组 语言平台(Languages and Platforms) 1.<关于枚举的种种>,Allen Lee 2.<using的几种用法>,Wi ...
- 《精通.NET互操作:P/Invoke、C++ Interop和COM Interop》
<精通.NET互操作:P/Invoke.C++ Interop和COM Interop>官方博客 一篇用C++/CLI讲述在托管委托(delegate)和非托管函数指针之间相互转化的文章 ...
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日)
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日) 本周Silverlight学习资源更新 Silverlight DataGrid用法 模板列 ...
- 使用PInvoke互操作,让C#和C++愉快的交互优势互补
一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet ...
- 项目Wiki的选择和配置
项目Wiki的选择和配置 项目组内部使用的wiki终于创建成功了!因为要开始一个新的重要项目,所以要开始用正规方法来进行项目管理.为了保证项目内部沟通的畅通,所以我们需要选择一个wiki来进行内部文档 ...
- c# 无法加载DLL“SQLite.Interop.dll”,: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
问题 用到了SQLite,在我的项目环境下调试运行都是正常的,但是发布部署之后报错:无法加载DLL"SQLite.Interop.dll",: 找不到指定的模块. (异常来自 HR ...
- 快速访问github镜像 wiki镜像重点_github问题小结
20220331 https://mp.weixin.qq.com/s/7ZFcD9BMB5WQnDAqZUgELg 高效的搜索github 20210821 https://zgc261.com/w ...
- .NET 4.0 Interop新特性ICustomQueryInterface (转载)
.NET 4.0 Interop新特性ICustomQueryInterface 在.NET Framework v4.0发布的新功能中,在名字空间System.Runtime.InteropServ ...
- 使用 mkdocs 搭建个人 wiki 站点
原文: https://rebootcat.com/2020/09/20/wiki/ why wiki 博客通常是用来记录一些完整的文章,每篇文章有一个主题.但是我想把平日里的一些笔记也记录到我的博客 ...
最新文章
- Java Nashorn--Part 3
- 广西农产品(广州)交易会 农业大健康·林裕豪:签约农商对接
- CodeForces - 571D Campus(数据结构综合)
- 需求简报_代码简报:我如何通过做自己喜欢的事情来获得顶级技术实习
- pycharm console日志如何输出到txt_日志记录——logging模块
- 8、QuickExec命令行的使用
- java run 方法_java线程中的run()方法能有几个啊?
- hadoop商品推荐_北京尚学堂学员学习经验分享:商品推荐
- 搭建Visual Studio C语言开发环境
- 4和2大于号小于号箭头那边_‘’口诀化‘’教学之二――大于号和小于号
- SSM框架将数据库数据导出为Excel文件
- Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`
- 教育专家李彦良谈双减后的素质教育和智慧教育
- 【读论文】RFN-Nest: An end-to-end residual fusion network for infrared and visible images
- 保险行业陆金所专题:聚焦小微、深耕高客的金融科技平台(20210107).PDF
- 如何撰写项目的解决方案
- 160个CrackMe-CrackMe-3
- 手机号+短信验证码登录注意
- 逆向工程实验Lab1
- java 正在等待可用的套接字。。。