Win32 API PInvoke

推荐官方开源 PInvoke 库 包含大量 win32 封装 在调用 win32 库的时候,小伙伴会遇到的问题是不知道对应的 win32 函数应该如何写。或者在网上抄了的代码的实现都有些诡异,想要自己封装发现工作量太大。好消息是官方将 PInvoke 库在 dotnet 基金会完全开源,包含了大量的 Win32 库,如 gdi32.dll 和 kernel32.dll 和 user32.dll 等 使用官方的库的优势是什么呢?第一个就是减少从网上复制粘... 阅读详情

PInvoke什么意思? Platform Invocation Services

 

以下两篇文章阐述了在C#中使用Win32API的细节

 

Visual C#中调用Windows API的要点

http://www.cnblogs.com/showna/articles/869295.html

 

在 C# 中通过 P-Invoke 调用Win32 DLL

http://msdn.microsoft.com/zh-cn/library/aa686045.aspx

 

注意,DllImport必须放在类定义中,一个DllImport对应一个API声明

 

MSDN - Windows API Reference

http://msdn.microsoft.com/en-us/library/aa383749(VS.85).aspx

 

推荐几个辅助.cs文件和工具

 

api.cs (C# API)

http://download.csdn.net/source/511344

 

大量常用Win32 API的C#声明(API函数、结构体和常数声明)

http://www.codefans.net/soft/1880.shtml

 

API精灵 for C#

http://download.csdn.net/source/644635

 

API 常量查询器

http://download.csdn.net/source/967181

 

 一个CHM格式的Windows API参考

http://www.netyi.net/Book/ace90888-7659-476f-be89-b22fc0b3919f.htm

 

推荐使用第一个api.cs,并逐步完善它

 

在文章结束前找到了一个绝好的站点http://www.pinvoke.net/

pinvoke是一个win32 api for .net wiki 上面有绝大多数api及相关数据结构、常量和枚举的C#和VB.NET定义,还包括了API调用的代码范例,而且pinvoki还提供了一个free的VS插件 PInvoke.net Add-in 通过它可以更方便的在.net开发环境中使用api,唯一的缺撼就是对于api的查询结果中只提供了api声明的定义,相关数据结构、常量和枚举需要单独查询,出得的结果也只是相关的pinvoke.net链接。

 

当然pinvoke.net也不是完美的,由于定义由网友提交,因此有些定义并不规范,最常见的就是参数类型的定义可能跟MSDN的时常有些出入,这个问题可以参考:

 

C#中调用Windows API时的数据类型对应关系

http://www.cnblogs.com/madyina/articles/864059.html

 

建议使用在项目中使用一个单独的cs文件存放所有Win32 API的声明及相关定义

 

Win32API.cs

  

  以上代码是从api.cs改进而来,将以上代码复制到VS中,查看效果

1、用四个region块,括起数据类型定义struct、常量定义const、枚举定义enum及API声明

2、为简化代码输入,struct、const、enum定义不放入class api中

3、每个region块与中间内容留出一空行,但最内层的region除外

4、为相关const定义增加region块哪#region MAX_ADAPTER,但struct不需要,因为struct定义本身就具有收缩功能

...

可以维护这样一个cs文件,在项目中使用和完善它,项目结束后单独保存出来

 

 

以下是一个PInvoke.net中关于GetAdapterInfo调用的范例代码的简化版

通过以上代码可以了解一种生疏了的api调用方式(分配堆-调用-根据返回大小重新分配-再调用)、Marshal的使用、非托管内存到托管内存的转换等操作等

 

以下是PInvoke.net中关于GetRasEnumEntries调用的范例代码

以上代码说明了变长数组的api调用方式,以及dwSize,cb,entries的使用

 

最后有一点需要提醒,虽然使用PInvoke可以调用Win32API,但这是需要牺牲一些运行时性能的,所以如果有对应的Managed API的话,还是建议选用Managed API。

 

 

.Net互操作之PInvoke PInvoke是Platform Invoke的缩写。开发过程中经常遇到C#项目需要调用Native C++编写的Dll,还有就是有时候需要调用WindowsAPI,而事实上,某些Windows API也是存在于Native C++ dll或者是C dll存在的。PINVOKE是其中一种方式。 有一本书《精通.Net互操作》我还没有读,但是从目录来看,书中介绍了三大方法来实现.Net与Nativ 阅读详情

相关推荐

自动生成PInvoke调用Windows APIC#函数声明.rar

自动生成PInvoke调用Windows APIC#函数声明... 可以在开发跨语言,com互操作,跨语言dll调用声明类型时作为参考工具

推荐一个查.net下win32 api使用方法的网站

http://www.pinvoke.net/虽然.net不提倡使用win32 api,但现在的.net framework没有完全覆盖所有的win32 api,而且一些场合使用win32 api还是最简单高效的方法。相信做老系统升级的程序员对此一定深有感触。我觉得这个网站最有用的就是每个api说明下面的Notes了,介绍了使用这个函数注意事项,比想查字典一样查msdn好许多。

NetFX的专栏 769

CsWin32:源生成器,用于将用户定义的Win32 PInvoke方法集和支持类型添加到C#项目中

C#/ Win32 P /调用源生成器 源生成器,用于将用户定义的Win32 P / Invoke方法集和支持类型添加到C#项目中。 特征 快速向您的C#项目中添加P / Invoke方法和支持类型。 没有庞大的程序集可与您的应用程序一起提供。 SafeHandle类型自动生成。 生成基于的xml文档并链接回docs.microsoft.com 先决条件 用于C#编译器的.NET 5 SDK或Visual Studio 2019 Update 8(16.8),增加了对Source Generators的支持。 在Visual Studio中使用源生成器的体验仍在改善,并且在VS 16.9中明显更好。 WPF项目还有。 此外,某些生成的代码可能需要在项目文件中使用C#9语言版本( <LangVersion>9</LangVersion> )。 有关更多信息,请参见期。 有关使用Wi

深入理解 P/Invoke 调用 Win32 API

本文介绍了利用P/Invoke技术在.NET环境中调用Win32 API的方法。P/Invoke作为托管代码与非托管代码的桥梁,通过DllImport属性声明外部函数,处理数据类型转换和参数传递。文章详细讲解了结构体定义、字符串处理等关键技术要点,并提供了创建窗口、文件操作等实际案例。掌握P/Invoke技术可以扩展.NET应用程序的能力边界,实现更底层的Windows系统功能调用,但需注意数据类型转换和内存管理等细节问题。

分享知识,拥抱变化 1053

C# 中通过 PInvoke 调用Win32 DLL

<br />我在自己最近的编程中注意到一个趋势,正是这个趋势才引出本月的专栏主题。最近,我在基于Microsoft.NETFramework的应用程序中完成了大量的Win32Interop。我并不是要说我的应用程序充满了自定义的interop代码,但有时我会在.NETFramework类库中碰到一些次要但又繁絮、不充分的内容,通过调用该WindowsAPI,可以快速减少这样的麻烦。<br />  因此我认为,.NETFramework1.0或1.1版类库中存在任何Windows所没有的功能*都不足为怪。毕竟

Jaylon Wang的专栏 3529

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 f...

weixin_30702413的博客 100

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

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

weixin_34380296的博客 181

几乎所有的微软sdk的C#声明尽在www.pinvoke.net

http://www.pinvoke.net/ PINVOKE.NET attempts to address the difficulty of calling Win32 or other unmanaged APIs in managed code (languages such as C# and VB .NET). Manually defining and using ...

weixin_30347335的博客 102

真的需要在.NET中使用WIN32 API的朋友,这里是你的宝库

目前最全的PInvoke资源网站:http://www.pinvoke.net/,里面包含了绝大部分已知Win32 API的 .NET封装。值得庆贺的是:里面一般都包含每个APIC#/VB.NET版本,还包含MSDN的引用连接。 转载于:https://www.cnblogs.com/unruledboy/archive/2005/06/23/179569.html...

weixin_34259159的博客 119

PInvoke.net

可以查询并生成C#格式的API调用, 适用于Visual Studio 2005

PInvoke.net官方提供的VS API插件

PInvoke.net官网提供的VS IDE下的API查询插件(目前支持VS2010, VS2012,VS2013),使用此插件让您方便的查询使用来自最权威的Pinvoke.net 提供的API

win32-API-简明教程(入门学习最佳教程)

win32-API-最佳教程,全面介绍了win32开发的构架,以及主要开发函数,上手快速。 学习最佳资料与教材。

PInvoke.NET Visual Studio 插件

大家知道,在.NET中有时会是用一些非托管代码,或者调用一些Win32 API。这个可以通过.NET 的 Platform Invoke(PInvoke)机制来完成。但是PInvoke 需要程序员自己来提供函数声明,这点比较麻烦且有可能出错。PInvoke.NET 可以给程序员提供可靠的声明,这样你就不会再花费额外的精力和时间PInvoke.NET 是一个维基,是用来让开发者们记录编辑一些PI

flanker base @ CSDN 2428

PInvoke

PInvokeIf you want to call one of the many Win32 API functions that are not available directly from the .NET framework, you should be able to call them using PInvoke (Platform Invoke). (PInvoke is

i-mimi 705

在VS2008以及VS2010里,加载PInvoke

對於時不時需要在 VB/C# 裡面塞入一些 Win32 API 功能的程式設計師而言, PInvoke.Net 是一個非常好用的工具 (它甚至被 MSDN 雜誌評選為最需要被安裝的十個 VS Addin 之一)。可惜的是, 雖然這個工具完全支援 VS2003/2005, 它似乎並不認識 VS2008 及 VS2010 (即使 VS2008/2010 都已經上市那麼久了)。 如果要讓它在

ccccffff的专栏 843
上一篇: WMI-概述
下一篇: EXCEL IO
X_Craft
博客等级 码龄19年 55粉丝 66原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值