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;
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!相关推荐

  1. 博客园期刊创刊号入选文章

    博客园期刊创刊号入选文章 期刊制作组 语言平台(Languages and Platforms) 1.<关于枚举的种种>,Allen Lee 2.<using的几种用法>,Wi ...

  2. 《精通.NET互操作:P/Invoke、C++ Interop和COM Interop》

    <精通.NET互操作:P/Invoke.C++ Interop和COM Interop>官方博客 一篇用C++/CLI讲述在托管委托(delegate)和非托管函数指针之间相互转化的文章 ...

  3. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日)

    Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日) 本周Silverlight学习资源更新 Silverlight DataGrid用法 模板列 ...

  4. 使用PInvoke互操作,让C#和C++愉快的交互优势互补

    一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet ...

  5. 项目Wiki的选择和配置

    项目Wiki的选择和配置 项目组内部使用的wiki终于创建成功了!因为要开始一个新的重要项目,所以要开始用正规方法来进行项目管理.为了保证项目内部沟通的畅通,所以我们需要选择一个wiki来进行内部文档 ...

  6. c# 无法加载DLL“SQLite.Interop.dll”,: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)

    问题 用到了SQLite,在我的项目环境下调试运行都是正常的,但是发布部署之后报错:无法加载DLL"SQLite.Interop.dll",: 找不到指定的模块. (异常来自 HR ...

  7. 快速访问github镜像 wiki镜像重点_github问题小结

    20220331 https://mp.weixin.qq.com/s/7ZFcD9BMB5WQnDAqZUgELg 高效的搜索github 20210821 https://zgc261.com/w ...

  8. .NET 4.0 Interop新特性ICustomQueryInterface (转载)

    .NET 4.0 Interop新特性ICustomQueryInterface 在.NET Framework v4.0发布的新功能中,在名字空间System.Runtime.InteropServ ...

  9. 使用 mkdocs 搭建个人 wiki 站点

    原文: https://rebootcat.com/2020/09/20/wiki/ why wiki 博客通常是用来记录一些完整的文章,每篇文章有一个主题.但是我想把平日里的一些笔记也记录到我的博客 ...

最新文章

  1. Java Nashorn--Part 3
  2. 广西农产品(广州)交易会 农业大健康·林裕豪:签约农商对接
  3. CodeForces - 571D Campus(数据结构综合)
  4. 需求简报_代码简报:我如何通过做自己喜欢的事情来获得顶级技术实习
  5. pycharm console日志如何输出到txt_日志记录——logging模块
  6. 8、QuickExec命令行的使用
  7. java run 方法_java线程中的run()方法能有几个啊?
  8. hadoop商品推荐_北京尚学堂学员学习经验分享:商品推荐
  9. 搭建Visual Studio C语言开发环境
  10. 4和2大于号小于号箭头那边_‘’口诀化‘’教学之二――大于号和小于号
  11. SSM框架将数据库数据导出为Excel文件
  12. Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`
  13. 教育专家李彦良谈双减后的素质教育和智慧教育
  14. 【读论文】RFN-Nest: An end-to-end residual fusion network for infrared and visible images
  15. 保险行业陆金所专题:聚焦小微、深耕高客的金融科技平台(20210107).PDF
  16. 如何撰写项目的解决方案
  17. 160个CrackMe-CrackMe-3
  18. 手机号+短信验证码登录注意
  19. 逆向工程实验Lab1
  20. java 正在等待可用的套接字。。。

热门文章

  1. 马王堆汉墓帛书‧老子甲本——道经
  2. python学习:函数传参数
  3. MySQL中字段类型与合理的选择字段类型;int(11)最大长度是多少?varchar最大长度是多少?...
  4. 数据库读取image类型发送到前端显示图片
  5. (三)Sass和Compass--制作精灵图片
  6. 求大数阶乘(10000以内)
  7. web前端研发工程师编程能力成长之路
  8. document.all.item的解释和一个表单向多页面提交
  9. CFile类打开文件的有趣现象
  10. web中用纯CSS实现筛选菜单