CSharp调用win32 api的几种方法对比

k1mlka

CSharp中想要调用dll最常用的就是DllImport标签。
我最初也是这样来调用系统的user32,shell32中的方法,但这需要手写导入进来的函数各种定义结构。比较靠谱的方法是直接复制黏贴网路上别人写好的现成的,或者去pinvoke.net这个网站上翻阅需要的接口定义,这个网站对应也有个插件可以在VS中安装,比较快捷。
除了手动导入dll以外,nuget中已经有了现成的封装。

  1. vanipa.PInvoke
    这个库是第三方维护手动维护比较全面的,该有的函数都有,基本可以应对所有情况。
  2. dotnet/Pinvoke
    这个是微软员工维护的,和上面一样但是却缺失了很多函数api,并且截止21年5月,这个项目一两年没啥大的变化,甚至issue中请求增加基础的一些api也没人管。Owner的重心跑到CsWin32上面去了
  3. CsWin32
    这个是近一年才搞的,win32metadata项目的csharp版本,是由官方维护的,想用来替代上面的Pinvoke的。通过从win32文档生成csharp代码的方式来自动导入api,这样就不会有上面缺失某某函数的情况,而且需要什么导入什么,不会有赘余的依赖。但是大概率会产生指针 unsafe的代码,需要手动写一些带有unsafe关键字的函数,不像上面已经处理过可以直接用csharp的ref或out语法来传参,获取一些参数。其二,代码产生在Microsoft.Windows.Sdk命名空间下,rider之类的别的ide会无法识别这个命名空间,但是能运行。只有vs能用(不知vscode能用不),还是挺恼人的

这个时间点三个nuget包还是第一个比较靠谱

阅读 224
16 声望
0 粉丝
0 条评论
你知道吗?

16 声望
0 粉丝
宣传栏