P/Invoke(Platform invoke)即在.NET Framework中调用Win32 API的过程。其中一个困难的地方就是确定要调用方法的签名(尤其是缺乏Win32编程经历的情况下),这经常会是一个反复尝试/出错的过程。向非托管Win32 API传递不正确的数据类型或值通常会导致内存泄漏或其它不希望的结果。

PInvoke.NET是一个wiki,用于建立正确的P/Invoke签名。wiki是一种任何人都可进行编辑的协作式网站,因此可以在那里找到数以千计的与使用P/Invoke相关的签名、示例和笔记。既然wiki可被任何人编辑,你也可以在使用这些信息的同时分享自己的经验。

显然这个wiki及其包含的信息很有价值,而PInvoke.NET Visual Studio插件则使其更具价值。在下载、安装PInvoke.NET插件后,你就可以在Visual Studio内搜索需要的签名或向其添加新的内容。在VS内的代码文件内点击右键,会看到有两个新的菜单项:Insert PInvoke Signatures和Contribute PInvoke Signatures and Types。

选择Insert PInvoke Signatures来插入一个新的PInvoke签名,这时会看到:
    

使用这个简单的对话框,你可以搜索需要调用的函数。还有一个可选项,你可以包含该函数所在的模块。现在,应用程序的一个基本的能力是让计算机发出蜂鸣声。那么需要搜索一下Beep函数,看看它会出现什么。如果如下:
    
    
    在结果中会显示该函数用法的信息(Beep函数的信息是"Generates simple tones on the speaker")。你可以看到供C#和VB.NET使用的签名。注意下面的文字Alternative Managed API,它给出了一个建议,告诉你.NET Framework 2.0中的System.Console.Beep方法具有相同功能(最好还是使用托管代码)。

对话框的底部还有一个链接,它会把你带向wiki中Beep方法的相应页面,这个页面包含了该方法的各个参数的相关文档以及一些代码示例。

在选择了要插入的签名后,点击Insert按钮,该签名就被添加到代码中了。在Beep的示例中是这样的:

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool Beep(uint dwFreq, uint dwDuration);

大功告成!现在就可以在代码中调用该方法了:

    Beep(1223, 1000);

PInvoke.NET wiki和Visual Studio插件为开发人员减少了很多痛苦,也节省了大量时间。wiki可以通过www.pinvoke.net访问,在该页面的左下角的Helpful Tools链接中可以找到该插件的下载。

PS:据说Beep函数还具有驱蚊之功效,不过需要知道相应的频率来设置第一个参数:)

By Anders

本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2007/01/13/pinvokeaddin.html,如需转载请自行联系原作者。

使用PInvoke.NET插件为托管代码添加Win32 API签名相关推荐

  1. via浏览器如何使用插件 Via浏览器添加使用插件教程

    1.尽管Via浏览器的体积小巧,但其中提供的功能可谓是五脏俱全,而想要体验更多服务的话,就需要去安装插件了,这需要大家点击右上角的横杠选项,并且从列表里选择"设置"功能. via浏 ...

  2. Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本

    title: Visual Studio中使用Macros插件给代码添加注释.时间和以及自动脚本 date: 2020-09-11 sidebarDepth: 2 tags: 代码 Visual st ...

  3. Ionic初学之Ionic3(Cordova)插件制作与添加

    现在制作APP都流行混合开发,Ionic是个不错的选择,但是很多原生的功能,混合开发是无法实现的,这时候就要根据功能来制作Cordova插件来实现,下面就记录第一次制作Cordova插件的步骤和遇到的 ...

  4. 揭示Win32 API拦截细节/API hooking revealed (1)

    原文出处:http://www.codeproject.com/system/hooksys.asp 简要介绍 拦截win32 API 调用对于多数windows开发人员来说都一直是很有挑战性的课题, ...

  5. 揭示win32 api拦截细节

    转自啊D 原文出处:http://www.codeproject.com/system/hooksys.asp     拦截win32 API 调用对于多数windows开发人员来说都一直是很有挑战性 ...

  6. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)...

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  7. java 调用win32 api 学习总结

    java使用JInvoke调用windows API 使用jinvoke调用windowsAPI.jna使用比较麻烦,需要写c代码和参数转换,jinvoke的使用就像jdk中的包一样. 官网使用参考: ...

  8. ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析

    ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 . /   // datadase odbc1.cpp : 定义应用程序的入口点.  //   #inc ...

  9. 在C#程序设计中使用Win32 API

    C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分 ...

  10. 深入浅出VC++串口编程--基于Win32 API

    1.API描述 在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与文件操作的API一致. 打开串口 Win32 中用于打开串口的API 函数为CreateFile,其原型为: H ...

最新文章

  1. 为什么方差的自由度是n-1啦?
  2. Error dialog box generic entry point
  3. 容器编排技术 -- 在Azure上使用CoreOS和Weave的 Kubernetes
  4. php判断手机是安卓系统还是ios系统
  5. [deviceone开发]-大家比较关注的应用内部升级
  6. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_4_练习_递归打印多级目录...
  7. 计算机科学与技术的班会,计算机科学与技术学院2014级信管三班班会
  8. 如何进行cad地理配准_地理配准和空间校正操作流程
  9. 问题描述:vcenter上数据存储的事件中有大量的警告,还有偶尔的报错,存储设备naa...的路径冗余已降级,路径。。已关闭,受影响的数据存储 与存储设备。。。连接丢失,路径。。已断开,受影响的存储
  10. python竖着展示诗_十八年-python诗词动画
  11. c# DGV导出excel 使用object类型数组,解决string类型需双击后或分列才可运算的异常
  12. 2022最全的BAT大厂面试题整理及分析
  13. 19、网络配线架打线工艺
  14. 通过TMG发布ActiveSync
  15. 通用Mapper注解方式实现动态SQL
  16. outlook2007 菜单灰色...不能使用的解决方案
  17. LDAP基础:8:ldap用户密码确认和修改
  18. oracle 通过数据库主键外键级联删除
  19. Tik Tok小店:英国tiktok小店怎么核对结算
  20. 消息规模超千亿,同程艺龙的消息系统建设实践

热门文章

  1. XXL-JOB 针对未授权访问导致远程命令执行漏洞的声明
  2. 微信小程序微商城(二):电商首页轮播、分类导航和新品特卖实现
  3. C# WinForm的ListView的列排序
  4. 搭建VUE环境、安装npm、node.js
  5. linux改变所属用户组
  6. 查 oracle 的sid,oracle 查询sid 运行的sql语句
  7. LINUX FFMPEG编译详细过程记录(最全)
  8. LINUX下载编译zlib
  9. Shell脚本中使用awk进行空格分词
  10. 错误解决办法:gcc编译时提示对‘sqrt’未定义的引用