当我访问静态属性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/