Socket Mobile の SocketScan SDK を使用する Xamarin ios アプリケーションを作成しています。スタティック ライブラリを dll に変換する Binding プロジェクトを作成しました。ただし、SktClassFactory.CreateScanObject () メソッドを使用して ISktScanObject のインスタンスを作成することはできません。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 = SktClassFactory.CreateScanObject (); の後に _scanObjectReceived オブジェクトをデバッグするときに表示される例外メッセージです。
- メッセージ System.MemberAccessException: 抽象クラスであるため、ScanAPI.ISktScanMsg のインスタンスを作成できません
- プロパティ System.MemberAccessException: 抽象クラスであるため、ScanAPI.SktScanProperty のインスタンスを作成できません
バインド プロジェクトの ISktScanObject インターフェイスの ApiDefinition は次のとおりです。
[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 インターフェイスの ApiDefinition は次のとおりです。
[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 オブジェクトを適切にインスタンス化するために必要なこと。前もって感謝します。