开发者社区> 长征3号> 正文

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

简介:
+关注继续查看
 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(12231000);

    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,如需转载请自行联系原作者。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Rainbond的 Gateway API 插件制作实践
Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范、移植性差等问题做出了改进
12 0
WordPress建站教程:如何使用插件管理 WordPress Heartbeat API
WordPress Heartbeat API 已经存在了将近十年。它提供了 WordPress 仪表板和主机服务器之间的无缝实时通信。Heartbeat API 内置于 WordPress 核心,提供强大的功能,可以显着改善网站管理体验。
22 0
又又又一个小更新,主题插件上线! 开源 API 管理工具更有意思
近日 Postcat 终于上新了用户期待已久的 12 款【主题插件】!喵喵我啊,想着这下再也没有哪位用户老爷会吐槽 我们 Postcat 的主题过于简洁吧!
16 0
Zotero翻译插件Zotero PDF Translate无法正常翻,翻译api接入
Zotero翻译插件Zotero PDF Translate无法正常翻,翻译api接入
347 0
Eoapi x OpenDLP 插件上线:扫描 API 敏感字段,让你的 API 更安全
最近我们看到一个更严峻的趋势,越来越多的 API 导致了非常严重的数据泄露。数据泄露对企业来讲,尤其是大型企业,以及关系到民生或基础设施的企业,他们一次大范围的数据泄露是非常致命的,可能不仅仅是业务上损失,还会涉及到监管层面。
98 0
小伙伴想写个 IDEA 插件么?这些 API 了解一下!
在看完 IDEA 插件开发简易教程后,小伙伴们是否迫不及待的想自己上手整一个插件了?心里规划好了一二三,但是却不知道从哪里开始下手。下面我分享下自己整理的一些常用的 API。
187 0
在Typecho中使用百度文本内容审核API过滤评论敏感内容插件
基于百度文本内容审核 API 写了一个插件,名为 Baidu TextCensor,可以用来过滤屏蔽一些垃圾留言,下面来说一下具体操作
149 0
最新 接口api插件 Swagger3 更新配置详解
最新 接口api插件 Swagger3 更新配置详解
213 0
10.源码阅读(插件式换肤-安卓Resources加载资源的过程-android api 26)
我们知道,每一个View的子类都可以设置backgroud,那么这个背景是如何加载出来的呢? 找到View的构造方法 public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { .
929 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
CUDA Math API
立即下载
阿里云 API 精选手册(Alibaba Cloud API Playbook)
立即下载
重保场景及API安全指南
立即下载