当我访问静态属性SharedController时,该值为null,但是由Objective Sharpie生成的API定义仅提供一个吸气剂。

BBDeviceController被实例化,但是其上的SharedController属性为null。因为它只有一个吸气剂,所以我不相信我能够在代码中实例化该属性。据我所知,SharedController没有在BBDeviceController的构造函数中初始化。我不确定BBDeviceController是静态类还是仅遵循单例设计模式,但是无论哪种方式,更新该类都不是解决方案。

BBDeviceController.h

@interface BBDeviceController : NSObject {
    NSObject <BBDeviceControllerDelegate>* delegate;

    BOOL debugLogEnabled;
    BOOL detectAudioDevicePlugged;
}

@property (nonatomic, weak) NSObject <BBDeviceControllerDelegate>* delegate;
@property (nonatomic, getter=isDebugLogEnabled, setter=setDebugLogEnabled:) BOOL debugLogEnabled;
@property (nonatomic, getter=isDetectAudioDevicePlugged, setter=setDetectAudioDevicePlugged:) BOOL detectAudioDevicePlugged;

+ (BBDeviceController *)sharedController;


结果API定义(APIDefinition.cs

[BaseType(typeof(NSObject))]
[Protocol]
interface BBDeviceController
{
    ...
    // +(BBDeviceController *)sharedController;
    [Static]
    [Export("sharedController")]
    BBDeviceController SharedController { get; }
    ...
}


从项目的视图控制器调用

public BBDeviceController bbDeviceController;
public override void ViewDidLoad()
{
    base.ViewDidLoad();
    bbDeviceController = BBDeviceController.SharedController;
    ConnectDevice();
}

private void ConnectDevice()
{
    bbDeviceController.StartBTScan(new string[] { DEVICE_NAME }, 60);
}


在目标C库的文档中,您可以这样使用sharedController

[[BBDeviceController sharedController] setDelegate:self];

当尝试做等效的C#时,出现错误,因为SharedController为null。
可能还需要关注的另一件事是,结果API定义文件中的SharedController定义已用[Verify(MethodToProperty)]标记,并且我必须手动添加[Static]才能从代码访问它。

最佳答案

我不确定您的确切问题是什么(可能是未正确链接,可能是plist设置不正确,等等),但是我已经成功使用最新的SDK(在撰写本文时为v3.7.2)做到了这一点。步骤如下:

1.使用以下sharpie命令进行绑定:

sharpie bind --output=. --namespace=WisePad2Binding --sdk=iphoneos13.2 --scope=<path-to-sdk>/BBDevice-iOS-SDK-3.7.2/Library <path-to-sdk>/BBDevice-iOS-SDK-3.7.2/Library/BBDeviceController.h

2.删除[Verify]标签

我继续将所有方法更改回由[Verify]标记的属性,只是为了减少机会。

3.将库添加到绑定项目

在绑定产品中,我没有使用“本机引用”文件夹(嗯,我最初尝试过,但没有用)。显然,制作绑定项目的“旧”方法是将库拖到项目根目录。当您执行此操作时,每个库都将附加一个.linkwith.cs(稍后会详细介绍)。我添加的库是:


libBBDevice-iOS-AudioAndBT-3.7.2.a
libBBDevice-iOS-AudioAndBT-3.7.2-simulator.a
libBBDeviceOTA-iOS-1.5.4.a
libBBDeviceOTA-iOS-1.5.4-simulator.a


然后在每个.linkwith.cs文件中将Assembly属性更改为...

[assembly: LinkWith ("<library-name>.a", SmartLink = true, ForceLoad = true, Frameworks = "AudioToolbox AVFoundation CoreAudio CoreBluetooth CoreGraphics CoreFoundation CoreLocation ExternalAccessory Foundation MediaPlayer MessageUI QuartzCore SystemConfiguration UIKit", LinkerFlags = "-lc++ -lz -ObjC")]

4.更新您的清单

确保将他们列出的所有内容here添加到您的plist中,否则这些内容将无法正常工作。

5.秘诀

如果我没有在主线程上执行某些(全部?)操作,那么我将无法正常工作,所以我只对主线程执行所有操作。另外,不要在未调用BBDeviceController.SharedController.ReleaseBBDeviceController()的情况下在共享控制器上设置委托(如果您之前已在其中设置了委托)。我的想法和祈祷发给其他尝试将此Xamarin与该SDK一起使用的人。

关于c# - 静态属性未在类中通过绑定(bind)实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57560168/

10-11 20:32