我正在创建一个使用SocketScan的SocketScan SDK的Xamarin应用程序。创建一个绑定项目,以将静态库转换为dll。但是无法使用ISktScanObject ()方法创建SktClassFactory.CreateScanObject实例。由于System.MemberAccessException,实例没有被完全创建。请看下面的代码
// A 1:1 of ApiHelper's Objective-C open: method
public void Open ()
{
_deviceInfoList.Clear ();
if (_noDeviceText != null) {
_deviceInfoList.Add (_noDeviceText, _noDeviceText);
}
if (_scanObjectReceived != null) {
SktClassFactory.ReleaseScanObject (_scanObjectReceived);
}
_scanObjectReceived = SktClassFactory.CreateScanObject (); //Two properties inside _scanObjectReceived are not getting created due to System.MemberAccessException.
Task.Run (() => InitializeScanAPIThread ());
_scanApiOpen = true;
}下面是我在调试_scanObjectReceived对象时在_scanObjectReceived = SktClassFactory.CreateScanObject ()行之后收到的异常消息;
绑定项目中ISktScanObject接口的ISktScanObject如下:
[Protocol, Model]
interface ISktScanObject {}
// @protocol ISktScanObject
[Protocol, Model]
[BaseType (typeof (NSObject))]
interface SktScanObject : ISktScanObject
{
// @required -(id<ISktScanMsg>)Msg;
[Abstract]
[Export ("Msg")]
ISktScanMsg Msg { get; }
// @required -(id<ISktScanProperty>)Property;
[Abstract]
[Export ("Property")]
SktScanProperty Property { get; }
} 绑定项目中SktClassFactory接口的SktClassFactory如下:
[BaseType (typeof(NSObject))]
interface SktClassFactory
{
// +(id<ISktScanObject>)createScanObject;
[Static]
[Export ("createScanObject")]
ISktScanObject CreateScanObject ();
// +(void)releaseScanObject:(id<ISktScanObject>)scanObj;
[Static]
[Export ("releaseScanObject:")]
void ReleaseScanObject (ISktScanObject scanObj);
// +(id<ISktScanApi>)createScanApiInstance;
[Static]
[Export ("createScanApiInstance")]
ISktScanApi CreateScanApiInstance ();
// +(void)releaseScanApiInstance:(id<ISktScanApi>)scanApi;
[Static]
[Export ("releaseScanApiInstance:")]
void ReleaseScanApiInstance (ISktScanApi scanApi);
// +(id<ISktScanDevice>)createDeviceInstance:(id<ISktScanApi>)scanApi;
[Static]
[Export ("createDeviceInstance:")]
ISktScanDevice CreateDeviceInstance (ISktScanApi scanApi);
// +(void)releaseDeviceInstance:(id<ISktScanDevice>)deviceInstance;
[Static]
[Export ("releaseDeviceInstance:")]
void ReleaseDeviceInstance (ISktScanDevice deviceInstance);
} 正确实例化_scanObjectReceived对象需要做些什么。提前谢谢。
发布于 2015-11-23 16:53:01
这可能早就应该执行了,但是使用当前的API,我能够创建一个iOS绑定并使用以下方法调用ISktScanObject & ISktScanApi:
ScanObject = SktClassFactory.CreateScanObject;
ScanApi = SktClassFactory.CreateScanApiInstance;这给了我关于抽象类的任何问题。
我用于SktClassFactory的SktClassFactory如下所示:
// @interface SktClassFactory : NSObject
[BaseType (typeof(NSObject))]
interface SktClassFactory
{
// +(ISktScanObject *)createScanObject;
[Static]
[Export ("createScanObject")]
ISktScanObject CreateScanObject { get; }
// +(void)releaseScanObject:(ISktScanObject *)scanObj;
[Static]
[Export ("releaseScanObject:")]
void ReleaseScanObject (ISktScanObject scanObj);
// +(ISktScanApi *)createScanApiInstance;
[Static]
[Export ("createScanApiInstance")]
ISktScanApi CreateScanApiInstance { get; }
// +(void)releaseScanApiInstance:(ISktScanApi *)scanApi;
[Static]
[Export ("releaseScanApiInstance:")]
void ReleaseScanApiInstance (ISktScanApi scanApi);
// +(ISktScanDevice *)createDeviceInstance:(ISktScanApi *)scanApi;
[Static]
[Export ("createDeviceInstance:")]
ISktScanDevice CreateDeviceInstance (ISktScanApi scanApi);
// +(void)releaseDeviceInstance:(ISktScanDevice *)deviceInstance;
[Static]
[Export ("releaseDeviceInstance:")]
void ReleaseDeviceInstance (ISktScanDevice deviceInstance);
}编辑:我的ISktScanObject在ApiDefinition中如下所示:
// @interface ISktScanObject : NSObject
[BaseType (typeof(NSObject))]
interface ISktScanObject
{
// -(ISktScanMsg *)Msg;
[Export ("Msg")]
ISktScanMsg Msg { get; }
// -(ISktScanProperty *)Property;
[Export ("Property")]
ISktScanProperty Property { get; }
}希望这有什么帮助。
发布于 2017-01-31 09:43:55
我看到您正在绑定一个@protocol,在Philippes中,SDK更改为对这种类型使用@interface,所以他的答案并不清楚。
通过为库无法实例化的返回类型添加一个骨架接口(空接口),并将所有返回类型和参数类型从类更改为接口名,我解决了问题(使用另一个库)。
注意添加的接口和更改的返回类型。
在此之前
// @protocol NXProximityZone <NSObject>
[Protocol, Model]
[BaseType(typeof(NSObject))]
interface NXProximityZone
{
// Methods and properties removed for simplicity
}
// @interface NXProximityManager : NSObject
[BaseType(typeof(NSObject))]
interface NXProximityManager
{
// +(NSObject<NXProximityZone> *)proximityZoneFromNotification:(NSNotification *)notification;
[Static]
[Export("proximityZoneFromNotification:")]
NXProximityZone ProximityZoneFromNotification(NSNotification notification);
// Methods and properties removed for simplicity
}之后
// @protocol NXProximityZone <NSObject>
[Protocol, Model]
[BaseType(typeof(NSObject))]
interface NXProximityZone
{
// Methods and properties removed for simplicity
}
// Skeleton interface
interface INXProximityZone { }
// @interface NXProximityManager : NSObject
[BaseType(typeof(NSObject))]
interface NXProximityManager
{
// +(NSObject<NXProximityZone> *)proximityZoneFromNotification:(NSNotification *)notification;
[Static]
[Export("proximityZoneFromNotification:")]
INXProximityZone ProximityZoneFromNotification(NSNotification notification);
// Methods and properties removed for simplicity
}有关框架接口的更多信息可以找到这里 (在页面中搜索骨架)
https://stackoverflow.com/questions/29680599
复制相似问题