2015-04-16 1 views
1

Я создаю приложение Xamarin ios, которое использует SocketScan SDK Socket Mobile. Создал проект Binding для преобразования статической библиотеки в dll. Но не удалось создать экземпляр ISktScanObject с использованием метода SktClassFactory.CreateScanObject(). Экземпляр не создается полностью из-за System.MemberAccessException. Пожалуйста, смотрите ниже кодSystem.MemberAccessException при вызове SktClassFactory.CreateScanObject(); в SocketScan Xamarin iOS Binding Project

// 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. Property System.MemberAccessException: Невозможно создать экземпляр ScanAPI.SktScanProperty, потому что он является абстрактным классом

ApiDefinition для интерфейса 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; } 
} 

ApiDefinition для Sk tClassFactory интерфейс в связывания проекта, как показано ниже:

[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. Заранее спасибо.

+0

Я также сталкиваюсь с теми же проблемами при создании связанный с проектом для подключения кабеля Ethernet Redpark для проекта Xamarin.iOS. Любой знает, как это решить? это также на форуме Xamarin. – Ravi

ответ

1

Это может быть давно, но с использованием текущего API я смог создать IOS связывания и вызвать ISktScanObject & ISktScanApi с помощью:

ScanObject = SktClassFactory.CreateScanObject; 
ScanApi = SktClassFactory.CreateScanApiInstance; 

Это не дал мне никаких проблем в отношении абстрактных классов.

Мой ApiDefinition для 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); 
} 

Edit: Мой ISktScanObject выглядит, как это в ApiDefinition:

// @interface ISktScanObject : NSObject 
[BaseType (typeof(NSObject))] 
interface ISktScanObject 
{ 
    // -(ISktScanMsg *)Msg; 
    [Export ("Msg")] 
    ISktScanMsg Msg { get; } 

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

Надежда это какой-либо помощи.

0

Я вижу, что вы привязываете @protocol, а в Филиппах ответ на 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 
} 

Более подробной информации о каркасных интерфейсах можно найти here (Искать страницу для скелета)