Я пытаюсь связать типы библиотеки Objective-C, используя btouch. Мне удалось скомпилировать мой файл определения API с помощью btouch и я успешно вызвал методы, которые не возвращают параметров или которые возвращают базовые параметры, такие как строка или целое число. Однако, когда я пытаюсь вызвать методы вызова, которые возвращают объекты экземпляра для других классов, определенных в файле определения API, я получаю исключение System.InvalidCastException . Таким образом, в следующем примере списка статический метод OpenConnection класса UltraliteManager вызывает это исключение при вызове из проекта MonoTouch.
Это заголовочный файл Objective-C:
#import <Foundation/Foundation.h>
@interface UltraliteConnection : NSObject {
@private
void * ulconnection;
}
- (id) initWithULConnection: (void*) connect;
- (void) dealloc;
- (void) close;
- (void) executeStatement: (NSString*) sql;
@end
@interface UltraliteManager: NSObject {}
+ (void) initialize;
+ (void) fini;
+ (UltraliteConnection*) openConnection: (NSString*)connectionParms;
@end
Это реализация Objective C (сокращенно, чтобы показать только соответствующие реализации):
@implementation UltraliteConnection
- (id) initWithULConnection: (void*) connect
{
[super init];
ulconnection = connect;
[self retain];
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (void) close
{
ULError error;
((ULConnection*) ulconnection)->Close(&error);
[self release];
}
@end
@implementation UltraliteManager
+ (UltraliteConnection*) openConnection: (NSString*)connectionParms
{
ULError error;
ULConnection * connbase;
UltraliteConnection * connwrap;
connbase = ULDatabaseManager::OpenConnection([connectionParms UTF8String],
&error,
NULL);
connwrap = [[UltraliteConnection alloc] initWithULConnection:connbase];
[connwrap release];
return connwrap;
}
@end
И это файл определения API:
using MonoTouch.Foundation;
namespace Ultralite {
[BaseType (typeof (NSObject))]
interface UltraliteConnection {
[Export("close")]
void Close ();
[Export("executeStatement:")]
void ExecuteStatement(string sql);
}
[BaseType (typeof (NSObject))]
interface UltraliteManager {
[Static, Export ("initialize")]
string Initialize ();
[Static, Export ("fini")]
void Fini ();
[Static, Export ("openConnection:")]
UltraliteConnection OpenConnection (string connectionParms);
}
}
Я обнаружил, что если я возвращаю NULL из моей реализации openConnection (т. Е. Заменим строку return connwrap; на return nil; ), то метод вернется без выброса исключения , Поэтому мне кажется, что это исключение связано с возвратом объекта UltraliteConnection в MonoTouch.
Кто-нибудь знает, что вызывает эту проблему и как я могу ее решить?