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

跨VB.NET与C#实现ISolution接口事件触发空引用异常排查

跨语言接口事件空引用问题根因

这个异常是VB.NET和C#编译器对接口事件的实现机制差异导致的,和编写的事件业务逻辑本身无关。

  • VB.NET编译器在处理带Implements关键字的事件声明时,会自动完成三件事:生成匹配事件签名的私有委托存储字段、将接口声明的事件的add/remove访问器和该存储字段直接绑定、在RaiseEvent触发代码中自动加入空委托判断,哪怕没有任何外部订阅事件,也不会抛出空引用异常。
  • C#侧使用的public event VmS.ISolution.ExecutionStartedEventHandler ExecutionStarted;是C#的自动实现事件简写语法,该写法生成的是类自身定义的独立事件,没有和ISolution接口中声明的事件的访问器做绑定。也就是说,接口层暴露的ExecutionStarted事件对应的委托存储位,和类内部能直接调用的ExecutionStarted事件对应的委托存储位,是两个完全隔离的独立对象。当在类内部执行ExecutionStarted(this)时,本质是调用类自身定义的那个事件的委托,如果没有外部订阅这个类级别的事件,委托本身就是null,直接调用就会稳定抛出“未将对象引用设置到对象实例”的异常。
可落地的修复步骤

完全复刻VB.NET编译器的绑定逻辑,用显式接口实现的方式完成事件对接:

  1. 为ISolution中定义的3个事件分别定义私有的委托存储字段,作为所有订阅逻辑的实际存储位置:
    private VmS.ISolution.ExecutionStartedEventHandler _executionStarted;
    private VmS.ISolution.ExecutionFinishedEventHandler _executionFinished;
    private VmS.ISolution.ErrorExecutingEventHandler _errorExecuting;
    
  2. 对每个接口声明的事件,使用显式接口实现语法将其add、remove逻辑绑定到对应的私有存储字段上:
    event VmS.ISolution.ExecutionStartedEventHandler VmS.ISolution.ExecutionStarted
    {
        add => _executionStarted += value;
        remove => _executionStarted -= value;
    }
    
    event VmS.ISolution.ExecutionFinishedEventHandler VmS.ISolution.ExecutionFinished
    {
        add => _executionFinished += value;
        remove => _executionFinished -= value;
    }
    
    event VmS.ISolution.ErrorExecutingEventHandler VmS.ISolution.ErrorExecuting
    {
        add => _errorExecuting += value;
        remove => _errorExecuting -= value;
    }
    
  3. 事件触发环节改为调用私有存储字段,同时加上空引用保护(也就是C#的?.语法,相当于VB.NET RaiseEvent内置的空判断逻辑):
    // 触发ExecutionStarted的正确写法
    _executionStarted?.Invoke(this);
    // 其余两个事件触发逻辑同理
    
验证与避坑
  • 修复完成后可以做连通性测试:将类实例转换为ISolution接口类型,在接口层面订阅事件,再在类内部触发事件,如果订阅方法能正常收到通知,说明两个独立的事件存储已经完成绑定;如果收不到通知,说明绑定逻辑存在遗漏。
  • 不要依赖C#编译器对事件的自动匹配逻辑,跨程序集、跨语言编译的接口事件,直接用显式实现的绑定方式,避免出现看似同名同签名、实际互不连通的“幽灵事件”。
  • C#不会像VB.NET那样为事件触发自动加入空判断,省略空判断的直接委托调用,在没有订阅者的场景下必然抛出对应空引用异常。

内容的提问来源于stack exchange,提问作者Andy-Kiev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 06:24:02