为什么.NET Framework就没有个专门的P/Invoke Library?

有个简单的问题:Looking for Windows API Definitions大体是在问:C#有没有类似C++中使用的windows.h文件?

这真是个愚蠢的问题,是个C#程序员都会知道,C#没有什么头文件的说法。所以答案太简单了:没有 -_-。

是啊,这是个C#程序员都知道的答案。但是怎么依然有人问出这个问题呢?所以,要么问问题的人是个白痴,要么其实是你没理解这个问题。

这个问题的真实目的是,他想要在C#中调用Native Windows API,但是又觉得一个个声明Windows API及其用到的数据结构很繁琐。而在C++中,引入了windows.h之后可以直接调用了。

当然更多的人理解了这个问题,并给出了靠谱些的答案:用http://pinvoke.net/

再进一步想,.NET Framework自己必然也用到了不少Windows API,如果Decompile一个几个.NET Framework的DLL,会发现想要的东西就在Microsoft.Win32下面,可惜的是,全是internal的。我们非得re-create the wheel.

为什么.NET Framework不把这些东西公开出来呢?我猜或许是因为.NET Framework本身应当是平台无关,如果把这些公开出来,使用这些API的代码显然就无法运行在Linux平台上。至于用于自己写PInvoke代码,虽然也让代码无法跨平台,但是这是用户行为,微软是没有负责的。

使用PInvoke并不是单单写写声明那么简单的,还要考虑当前的操作系统支持不支持,不支持有没有Workaround;还要考虑参数的编解码。每次要用PInvoke的时候都要把这些事情重新做一遍一点意义也没有。

所以,http://pinvoke.net/就是个垃圾。http://pinvoke.codeplex.com/ 才是更好的选择。

没有愚蠢的问题,只有愚蠢的答案。

posted on   南柯之石  阅读(738)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

导航

< 2013年1月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

统计

点击右上角即可分享
微信分享提示