CSharp调用win32 api的几种方法对比
Posted k1mlka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSharp调用win32 api的几种方法对比相关的知识,希望对你有一定的参考价值。
CSharp中想要调用dll最常用的就是DllImport标签。
我最初也是这样来调用系统的user32,shell32中的方法,但这需要手写导入进来的函数各种定义结构。比较靠谱的方法是直接复制黏贴网路上别人写好的现成的,或者去pinvoke.net这个网站上翻阅需要的接口定义,这个网站对应也有个插件可以在VS中安装,比较快捷。
除了手动导入dll以外,nuget中已经有了现成的封装。
- vanipa.PInvoke
这个库是第三方维护手动维护比较全面的,该有的函数都有,基本可以应对所有情况。 - dotnet/Pinvoke
这个是微软员工维护的,和上面一样但是却缺失了很多函数api,并且截止21年5月,这个项目一两年没啥大的变化,甚至issue中请求增加基础的一些api也没人管。Owner的重心跑到CsWin32上面去了 - CsWin32
这个是近一年才搞的,win32metadata项目的csharp版本,是由官方维护的,想用来替代上面的Pinvoke的。通过从win32文档生成csharp代码的方式来自动导入api,这样就不会有上面缺失某某函数的情况,而且需要什么导入什么,不会有赘余的依赖。但是大概率会产生指针 unsafe的代码,需要手动写一些带有unsafe关键字的函数,不像上面已经处理过可以直接用csharp的ref或out语法来传参,获取一些参数。其二,代码产生在Microsoft.Windows.Sdk命名空间下,rider之类的别的ide会无法识别这个命名空间,但是能运行。只有vs能用(不知vscode能用不),还是挺恼人的
这个时间点三个nuget包还是第一个比较靠谱
以上是关于CSharp调用win32 api的几种方法对比的主要内容,如果未能解决你的问题,请参考以下文章