如何修改SWIG C#包装层仅为实例方法添加swigCPtr空校验
SWIG仅对实例方法插入释放校验逻辑的解决方案
你想要的类似static=false的限定效果可以通过SWIG内置的$isstatic特殊变量实现,该变量在生成代码时会自动替换为1(静态方法)或0(实例方法),只需在校验逻辑外层增加条件判断即可,无需手动枚举所有非静态方法名。
修改后的代码如下:
%define DISPOSED_CHECK // 仅非静态方法生成校验逻辑 %if !$isstatic if (swigCPtr.Handle == global::System.IntPtr.Zero) { // 此处填写你的自定义校验逻辑,例如抛出对象已释放异常 throw new global::System.ObjectDisposedException("$classname", "对象实例已被释放,无法调用当前方法"); } %endif %enddef // 原有的csout typemap无需修改规则,保持原有写法即可 %typemap(csout, excode=SWIGEXCODE) bool, const bool & { DISPOSED_CHECK bool ret = $imcall;$excode return ret; } // 其余类型的csout typemap均沿用该模式即可
生成C#代码时,静态方法的DISPOSED_CHECK会被自动过滤为空,不会插入校验代码,不会出现找不到swigCPtr变量的编译错误;所有实例方法会自动插入校验逻辑,完全符合你的需求。
更简便的全局注入方案
如果你需要给所有返回值类型的方法都加上校验,不需要逐个定义csout typemap,可以直接使用csmethodbody特征全局注入:
// 给所有方法的方法体开头插入DISPOSED_CHECK %feature("csmethodbody") %{ DISPOSED_CHECK $body %}
该写法会自动覆盖所有实例方法,包括返回值为void的方法,不用单独配置每一类返回值的typemap,维护成本更低。
内容的提问来源于stack exchange,提问作者Alexander Vostres
相关产品推荐
相关产品推荐

