PInvoke是Platform Invoke的缩写。开发过程中经常遇到C#项目需要调用Native C++编写的Dll,还有就是有时候需要调用WindowsAPI,而事实上,某些Windows API也是存在于Native C++ dll或者是C dll存在的。PINVOKE是其中一种方式。
有一本书《精通.Net互操作》我还没有读,但是从目录来看,书中介绍了三大方法来实现.Net与Native dll之间的交互,一个是PINVOKE;第二个是通过C++ Clr进行一次封装,经由C# ==> C++Clr ==>Native C++;第三种是通过COM的方式。其中前两种方式在项目开发中我都是用过,个人倾向是,如果是调用Windows API,采用PINVOKE方式;如果需要调用的是自己项目组内编写的Native C++ dll,我倾向采用C++ Clr封装过度的形式,这样的好处是减少.Net工程与Native C++之间的耦合性。
PInvoke使用方法是有固定套路的,有一个非常好的网站(http://pinvoke.net/)提供了大量的Windows API在C#中的声明方法,另外就是还提供了一个VS的插件,利用该插件可以方便的将Windows API以PInvoke的声明方式插入到C#代码中,很是好用。减少了开发人员自己写PInvoke声明时,对于Windows API中的各种各样参数在C#中的对应类型的烦恼。