MAUI绑定iOS委托类时实例化失败,寻求解决方法
解决iOS框架绑定MAUI时委托实例化错误的思路
核心问题分析
你遇到的错误根源是对C#继承规则的误解:原生协议WYSSignatureProcessDelegate继承了NSObjectProtocol,要求遵循该协议的类必须是NSObject子类。C#中继承NSObject类 + 实现协议接口属于单继承+多接口实现,完全符合语法规范,并非你以为的“多继承”。直接继承绑定生成的协议接口会导致原生侧无法识别实例,从而抛出类未加载的错误。
具体解决方案
1. 保留Sharpie生成的绑定代码
绑定代码无需修改,它已正确映射原生协议:
// @protocol WYSSignatureProcessDelegate <NSObject> [Protocol] [BaseType (typeof(NSObject))] interface WYSSignatureProcessDelegate { // @required -(void)documentPreparedForSignature:(NSData * _Nonnull)documentDigest withReason:(NSString * _Nonnull)reason; [Abstract] [Export ("documentPreparedForSignature:withReason:")] void DocumentPreparedForSignature (NSData documentDigest, string reason); }
2. 修正C#委托实现类
改为继承NSObject并实现协议接口,同时保留[Export]属性让原生识别协议方法:
private class SignatureProcessDelegate : NSObject, WYSSignatureProcessDelegate { public event EventHandler<IDocumentPreparedEventArgs> DocumentPreparedEventHandler; [Export("documentPreparedForSignature:withReason:")] public void DocumentPreparedForSignature(NSData documentDigest, string reason) { // 将NSData转换为Stream供上层业务逻辑使用 using var stream = documentDigest.AsStream(); DocumentPreparedEventHandler?.Invoke(this, new DocumentPreparedEventArgs(stream, reason)); } }
3. 关键注意事项
- 必须继承
NSObject:满足原生协议对NSObjectProtocol的依赖,确保原生侧能正确识别实例类型 - 严格匹配
[Export]签名:方法签名必须和绑定代码完全一致,否则原生无法检测到协议方法的实现 - 处理参数类型转换:绑定代码中定义的是
NSData,实现类需先接收原生类型再转换为Stream,避免类型不匹配导致绑定失败
内容的提问来源于stack exchange,提问作者Maxime Esprit
相关产品推荐
相关产品推荐

