C# 为什么我会得到一个异常,说有注册的CBCentralManager事件处理程序,而实际上没有?

C# 为什么我会得到一个异常,说有注册的CBCentralManager事件处理程序,而实际上没有?,c#,ios,xamarin.forms,C#,Ios,Xamarin.forms,我正在开发一个Xamarin.Forms(版本4.8.0.1687)跨平台应用程序,它需要能够使用蓝牙连接到自身的其他实例。我正在为BLE使用共享接口/特定于平台的实现模式。在iOS方面,我遇到了一个令人费解的错误:在实例化我的类(ActingCentral)时,其中包含一个CBCentralManager成员,当我将回调委托分配给该成员时,应用程序崩溃并抛出一个System.Reflection.TargetInvocationException。检查InnerException时,我发现它是

我正在开发一个Xamarin.Forms(版本4.8.0.1687)跨平台应用程序,它需要能够使用蓝牙连接到自身的其他实例。我正在为BLE使用共享接口/特定于平台的实现模式。在iOS方面,我遇到了一个令人费解的错误:在实例化我的类(ActingCentral)时,其中包含一个CBCentralManager成员,当我将回调委托分配给该成员时,应用程序崩溃并抛出一个System.Reflection.TargetInvocationException。检查InnerException时,我发现它是一个系统。带有消息的InvalidOperationException事件注册正在覆盖现有委托。只需使用事件或您自己的委托:MyProject.iOS.ManagerDelegate corebooth.CBCentralManager+_CBCentralManagerDelegate

起初,我想象我一定是心不在焉地在某个地方包含了一个我刚刚忘记或丢失的事件处理程序,但当我将类剥离到仍然满足我的接口的最简单的Essentials时,它仍然触发了异常。我仔细检查了我的CBCentralManagerDelegate派生的委托类是否覆盖了所有抽象方法,甚至是不推荐的RetrievedConnectedPeripherals,以确保未实现的方法不是问题所在。(我尝试过使用和不使用RetrievedConnectedPeripherals)在这一点上,我很确定这个问题超出了我有限的理解

为了完整性,我尝试删除委托分配,并显式分配事件处理程序,这确实有效,因此如果需要,我可以回退;但是我发现委托类模式更干净,更易于阅读和维护,所以我还没有完全放弃

下面是包含CBCentralManager实例的精简类:

public class ActingCentral : IActingCentral
{
    public bool IsConnected { get { return true; } }

    private readonly CBCentralManager manager;

    public ActingCentral( )
    {
        this.manager = new CBCentralManager();
        this.manager.Delegate = new ManagerDelegate(); // Exception thrown here
    }

    public async void Connect(int index)
    {
        await Task.Delay(100);
    }

    public async Task<List<IPeripheral>> ScanForService(string serviceUuid)
    {
        await Task.Delay(100);
        return new List<IPeripheral>();
    }
}

有人能告诉我为什么会抛出此异常吗?

我看到有一个构造函数接受两个参数:DelegateManager和DispatchQueue。如果您能够确定为DispatchQueue提供什么,那么您可以在一条语句中创建和分配:
this.manager=new CBCentralManager(new ManagerDelegate(),?)
public class ManagerDelegate : CBCentralManagerDelegate
{
    public override void ConnectedPeripheral(CBCentralManager central, CBPeripheral peripheral)
    {
    }

    public override void DisconnectedPeripheral(CBCentralManager central, CBPeripheral peripheral, NSError error)
    {
    }

    public override void DiscoveredPeripheral(CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI)
    {
    }

    public override void FailedToConnectPeripheral(CBCentralManager central, CBPeripheral peripheral, NSError error)
    {
    }

    public override void RetrievedConnectedPeripherals(CBCentralManager central, CBPeripheral[] peripherals)
    {
    }

    public override void RetrievedPeripherals(CBCentralManager central, CBPeripheral[] peripherals)
    {
    }

    public override void UpdatedState(CBCentralManager central)
    {
    }

    public override void WillRestoreState(CBCentralManager central, NSDictionary dict)
    {
    }
}