如果最终csharp要在多平台中运行,则这里要编译多个版本的原生二进制程序,譬如windows系统下的
occsharp.i中的模块名称,为csharp侧导入c++dll的模块名称,可以按照自己的逻辑修改
本套i文件需要下载swig3.0.12,swig4与之不兼容
4、编写批处理文件makewrapper.bat- 设置occ编译成果路径、swig路径和tclsh路径
- 设置swig选项
- 调用swig命令,生成c++导出文件和csharp导入文件
rem 设置occ编译成果路径、swig路径和tclsh路径 set TCLSH=C:ActiveTclbintclsh.exe set SWIG=D:Toolsswigwin-3.0.12swig.exe set BUILD_TYPE=Debug set CASROOT=D:Sdksopencascade-7.6.0 set CSF_OCCTBinPath=D:Sdksopencascade-7.6.0win64vc14bind set CSF_OCCTLibPath=D:Sdksopencascade-7.6.0win64vc14libd set CSF_OCCTIncludePath=D:Sdksopencascade-7.6.0inc rem 设置swig选项 set "SWIG_OPTIONS= -c++ -Wextra -w309 -csharp -fcompact -fvirtual -DSWIG2_CSHARP -D_WIN32" rem 调用swig命令,生成c++导出文件和csharp导入文件 "%SWIG%" %SWIG_OPTIONS% "-I%~dp0swig" "-I%aWrapperRoot%" "-I%CSF_OCCTIncludePath%" -outdir "%~dp0wrappers" "%~dp0swig/occcsharp.i"5、运行批处理文件,生成c++导出文件和csharp导入文件
生成的c++文件在swig文件夹下,文件如下:
生成的csharp文件在wrapers文件夹下,文件如下:
在生成文件过程中,如果报错,是因为该套i文件和swig版本不支持模板嵌套。故需要对occ文件和生成cs文件做修改。
-
更改BVH_Box.hxx
- 原因是Swig不能处理嵌套的template,且暂时BVH_BaseBox仅有BVH_Box一个实现,无需内层模板
- 原因是Swig不能处理嵌套的template,且暂时BVH_BaseBox仅有BVH_Box一个实现,无需内层模板
-
更改NCollection_CellFilter.hxx
- 将Inspector::IsEqual改为IsEqual即不调用模板中的IsEqual函数,而调用当前类中的IsEqual函数
- 原因是Swig封装后,实例化模板时无法找到IsEqual的实现
occwrapcsharp项目为c++dll项目,添加生成cxx和h文件
csharp项目为c#dll项目,添加生成的cs文件,修改头文件库文件包含路径和依赖occ lib
test项目为c#dll项目,添加依赖,依赖csharp项目
c++的dll名称要与occsharp.i中的模块名称保持一致,参考2条的注意事项
7、编译测试项目 注意:如果有编译错误,大概率还是模板嵌套的问题,将生成的cs文件中的嵌套模板做修改,直接删除模板参数
编译通过后,将occ dll拷贝到项目路径下,否则会提示找不到依赖的dll
如果要实现c# 和c++ 混合调试,有两点注意事项:
1. 使用vs,不要用rider;rider似乎还不支持混合调试
2. c#的相关项目要打开支持native调试开关,具体方法右键项目,然后如下图



