P/Invoke with SWIG

还是说P/Invoke,不过这回不大一样,因为我找到了一个工具来帮忙了,而不是用极易出错的方式手工进行操作,这个工具就是SWIG:Simplified Wrapper and Interface Generator。

SWIG image

HOME:http://www.swig.org/
WIKI:http://www.dabeaz.com/cgi-bin/wiki.pl
WIKIPEDIA:http://en.wikipedia.org/wiki/SWIG

这玩意儿居然可以根据C/C++的头文件直接生成出各种脚本语言的包装类,包括Lua、Tcl、Perl、Python、Ruby、Guile、Chicken、PHP、Java、C#、Ocaml(见WIKIPEDIA上面的介绍)。不仅如此,它和我以前看到的几个类似的工具不同,它似乎还带了一个C/C++编译器前端,可以利用语义分析过程处理各种#include、#define、typedef等等造成的复杂情况,和一般的依赖于文本替换的类似工具根本就不在一个重量级。

对于C#,它自动生成的代码大量应用了P/Invoke,产生了大量的static extern声明。不过,它们对包装类的使用者来讲是透明的。比如,原来C++的class会被自动对应到一个C#的class,你能看到的就是它的property和medhod而已,和普通C#的class没什么两样。

我在它的Example文件夹下面看到了好多例子,关于C#的有class、enum、funcptr、reference、simple、template、variables。注意到,很多原本很难通过P/Invoke调用的Native元素比如C++类型、方法指针、C++模版类/方法,它都能支持,摆脱了P/Invoke只能用于Invoke结构体和C导出函数的局限。也许C++有很多更复杂的语法或用法它还没能支持(我不确定,这个还有待继续研究),但也已经相当NB了。

真是相见恨晚啊,早知道有这个东西,就不会有这个post存在了

BTW,
中国的太监们居然把WIKIPEDIA这么好的网站都给阉了,实在是匪夷所思。好在通过IP还是可以访问;再懒一点,可以改一下你的hosts文件(%windir%\system32\drivers\etc),在最后面接上这么几行:

145.97.39.155 www.wikipedia.org
145.97.39.155 en.wikipedia.org
145.97.39.155 zh.wikipedia.org
145.97.39.155 upload.wikimedia.org

学新东西的时候WIKIPEDIA还是很有用的,特别是那些专业词汇,找起来比GOOGLE更精确,嗯。

原文地址:https://www.cnblogs.com/gxh973121/p/369107.html