You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:45:04