首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.MemberAccessException调用SktClassFactory.CreateScanObject ();在SocketScan Xamarin iOS绑定项目中

System.MemberAccessException调用SktClassFactory.CreateScanObject ();在SocketScan Xamarin iOS绑定项目中
EN

Stack Overflow用户
提问于 2015-04-16 16:21:13
回答 2查看 317关注 0票数 1

我正在创建一个使用SocketScan的SocketScan SDK的Xamarin应用程序。创建一个绑定项目,以将静态库转换为dll。但是无法使用ISktScanObject ()方法创建SktClassFactory.CreateScanObject实例。由于System.MemberAccessException,实例没有被完全创建。请看下面的代码

代码语言:javascript
复制
// 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 ()行之后收到的异常消息;

  1. Msg System.MemberAccessException:无法创建ScanAPI.ISktScanMsg的实例,因为它是一个抽象类
  2. 属性System.MemberAccessException:无法创建ScanAPI.SktScanProperty的实例,因为它是一个抽象类

绑定项目中ISktScanObject接口的ISktScanObject如下:

代码语言:javascript
复制
[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如下:

代码语言:javascript
复制
[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对象需要做些什么。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-11-23 16:53:01

这可能早就应该执行了,但是使用当前的API,我能够创建一个iOS绑定并使用以下方法调用ISktScanObject & ISktScanApi:

代码语言:javascript
复制
ScanObject = SktClassFactory.CreateScanObject;
ScanApi = SktClassFactory.CreateScanApiInstance;

这给了我关于抽象类的任何问题。

我用于SktClassFactory的SktClassFactory如下所示:

代码语言:javascript
复制
// @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中如下所示:

代码语言:javascript
复制
// @interface ISktScanObject : NSObject
[BaseType (typeof(NSObject))]
interface ISktScanObject
{
    // -(ISktScanMsg *)Msg;
    [Export ("Msg")]
    ISktScanMsg Msg { get; }

    // -(ISktScanProperty *)Property;
    [Export ("Property")]
    ISktScanProperty Property { get; }
}

希望这有什么帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-01-31 09:43:55

我看到您正在绑定一个@protocol,在Philippes中,SDK更改为对这种类型使用@interface,所以他的答案并不清楚。

通过为库无法实例化的返回类型添加一个骨架接口(空接口),并将所有返回类型和参数类型从类更改为接口名,我解决了问题(使用另一个库)。

注意添加的接口和更改的返回类型。

在此之前

代码语言:javascript
复制
// @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
}

之后

代码语言:javascript
复制
// @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
}

有关框架接口的更多信息可以找到这里 (在页面中搜索骨架)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29680599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档