近来想给写好的C++代码做C#接口,上网查了自动封装的工具。
总结下来有4种方式:
1. 使用invoke方式,就是直接在C#中引用c++写发的dll。这个方法适用于简单情况,复杂情况代码太大。
2. 编写com来使用dll,熟悉com技术的可以尝试。
3. 使用CLR C++(又称托管C++)。这个技术是给C++添加元信息,并自动管理了指针,很像C#了。但基本像是要新学一个语言(成本有点高)。然后基于微软的通用语言基础结构(CLI,Common Language Infrastructure),所有语言(包括C#)都被转换成为这个中间格式,当然C#也就能调用这些代码了。
4. 也是使用CLI技术,不过是C++/CLI。区别在于这个只是给C++代码做一个封装,代码并不过高。是笔者最推荐的方式。
说守了实现方式,现在说下自动封装工具。如果要自己写代码,即使只写封装接口,在面对大型工程时也是不能承受的。因为写出的代码都要维护。于是自动封装工具就有了用武之地。目前我google到4个工具:
PInvoke 这个只用c++头文件和编译好的dll就能完成封装,应该是C++/CLI方式的。而且免费。
xInterop 这个是根据头文件生成的,应该是C++/CLI方式的,且支持双向调用(即C#可调用C++代码,C++代码也可调用C#代码 )。在网站上没有看到开源或是免费的信息。
SWIG 这个比较大名顶顶了。可以为C++提供很多语言的接口,比如 脚本语言 Javascript, Perl, PHP, Python, Tcl 和 Ruby,非脚本语言 C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), D, Go language, Java including Android, Lua, Modula-3, OCAML, Octave, Scilab 和 R。但是对C++class类的信息提供不足。
Mono/C# 一个托管于GitHub的开源工具,可以为C/C++代码提供C#访问。Mono是开源c#实现(不归微软管 ),而且是跨平台的。Unity3D用的就是 Mono的C#接口。
今天先简单说下,日后用时再详细对比。