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

底层Swift方法调用时,重写的Xamarin C#方法未触发问题排查

问题原因及解决方案

核心问题1:绑定代码的方法选择器映射错误

你生成的C#绑定代码中,Pingpong方法的Export属性指定了错误的Obj-C选择器:

[Export ("foobar")]
void Pingpong ();

原Swift方法pingpong()暴露给Obj-C后的选择器是pingpong,而非foobar。这导致C#的Pingpong方法无法和原方法的选择器关联,所以Swift调用pingpong时,找不到你重写的C#方法。

修复方式:将Export属性改为正确的选择器:

[Export ("pingpong")]
void Pingpong ();

核心问题2:Swift方法未启用动态派发

Swift中,仅标记@objc的方法可能被编译器优化为静态派发,绕过Obj-C Runtime,导致Xamarin的子类重写无法被触发。要确保方法通过Obj-C Runtime进行动态派发,需要给Swift方法添加dynamic关键字:

@objc(Foobar)
public class Foobar: NSObject {
    @objc dynamic
    public func pingpong() {
         //...
    }
}

额外验证点

确认Swift代码中使用的是C#创建的Fibar实例,而非直接创建Foobar实例。如果Swift侧是let foo = Foobar(),调用的只会是原Foobar的方法;必须让Swift使用你在C#中实例化的Fibar对象,才能触发重写的方法。

内容的提问来源于stack exchange,提问作者XDS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:45:29