使用SWIG生成C#包装器时typedef跨模块边界冲突问题求助
解决SWIG生成C#包装器时typedef重复定义的冲突问题
核心思路
通过控制SWIG在导入模块中不重复生成typedef的C#代码,转而引用核心模块中已定义的类型,避免程序集冲突。
方法一:在核心模块显式定义委托类型,导入模块忽略重复生成
- 修改
clstepcore.i,将CF_init的typedef替换为C#委托的显式定义,确保它仅属于clstepcore命名空间:
%module(namespace="Clstepcore") clstepcore %{ #include "Registry.h" %} // 用SWIG的cscode typemap直接生成C#委托,替代自动生成的typedef %typemap(cscode) CF_init %{ public delegate void CF_init(Registry registry); %} class Registry; typedef void ( * CF_init )( Registry & ); class Registry { public: Registry( CF_init initFunct ); ~Registry(); };
- 修改
sdai_IFC4.i,在%import后添加%ignore指令阻止重复生成CF_init:
%module(namespace="SdaiIfc4") sdai_IFC4 %{ #include "schema.h" %} %import "clstepcore.i" // 忽略CF_init,避免重复生成定义 %ignore CF_init; %callback("%s_cb"); void SchemaInit (Registry &); %nocallback;
方法二:使用%extern声明类型来自外部模块
在sdai_IFC4.i中,%import后用%extern告诉SWIGCF_init是已在其他模块中定义的外部类型,无需重新生成:
%module(namespace="SdaiIfc4") sdai_IFC4 %{ #include "schema.h" %} %import "clstepcore.i" // 声明CF_init为外部类型,复用clstepcore中的定义 %extern CF_init; %callback("%s_cb"); void SchemaInit (Registry &); %nocallback;
方法三:用%inline限制typedef的代码生成范围
在clstepcore.i中用%inline块包裹typedef,限制其仅在当前模块生成代码,%import仅获取类型信息而非生成代码:
%module(namespace="Clstepcore") clstepcore %{ #include "Registry.h" %} class Registry; // 用%inline包裹typedef,确保仅当前模块生成C#代码 %inline %{ typedef void ( * CF_init )( Registry & ); %} class Registry { public: Registry( CF_init initFunct ); ~Registry(); };
随后在sdai_IFC4.i中添加%ignore CF_init;即可避免重复定义。
内容的提问来源于stack exchange,提问作者Marc Dannemann
相关产品推荐
相关产品推荐

