Связывание класса Objective C с проблемой C #
Проект monotouch описывает, как связать типы Objective C для использования с MonoTouch. Нам не удалось сделать это для библиотеки AdMob (см. Также блог monotouch-binding-for-admob на sabonrai dot wordpress dot com .
Поэтому мы решили создать минимально возможный тестовый проект. Мы написали простой класс objc с двумя простыми методами, один из которых возвращает строку, а другой возвращает целое число.
Вот TstLib.h:
#import <Cocoa/Cocoa.h>
@interface TstCls : NSObject {
}
- (NSString *) Version;
- (int) GimmeAnInt;
@end
и файл TstLib.m:
#import "TstCls.h"
@implementation TstCls
- (NSString *) Version {
return @"I ain't got a version, I'm a poor lonesome cowboy...";
}
- (int) GimmeAnInt {
return 110646;
}
@end
У нас есть небольшой консольный проект objc для проверки этой библиотеки. Вот код:
#import <Cocoa/Cocoa.h>
#import "../TstLib/TstCls.h"
int main(int argc, char *argv[])
{
TstCls* tstCls = [[TstCls alloc] init];
NSLog(@"version = %@", [tstCls Version]);
NSLog(@"the int = %d", [tstCls GimmeAnInt]);
return NSApplicationMain(argc, (const char **) argv);
}
Итак, давайте определим файл привязки для утилиты btouch.
using MonoTouch.Foundation;
namespace TstLib {
[BaseType (typeof (NSObject))]
interface TstCls {
[Export ("Version")]
string Version ();
[Export ("GimmeAnInt")]
int GimmeAnInt ();
}
}
Затем мы создаем файл libTstLib.a и файл TstLib.dll с помощью утилиты btouch:
/Developer/MonoTouch/usr/bin/btouch -o TstLib.dll TstCls.cs
Теперь мы создаем новое приложение для iphone на основе окна Monotouch «ApiTest», добавляем каталог Lib с файлами libTstLib.a и TstLib.dll, добавляем ссылку на этот файл TstLib.dll и интегрируем наш TstLib в файл Main.cs. :
using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using TstCls;
namespace ApiTest
{
// -gcc_flags "-L${ProjectDir}/Lib -lTstLib -ObjC"
// or
// -gcc_flags "-L${ProjectDir}/Lib -lTstLib -force_load ${ProjectDir}/Lib/libTstLib.a"
public class Application
{
static void Main (string[] args)
{
UIApplication.Main (args);
}
}
// The name AppDelegate is referenced in the MainWindow.xib file.
public partial class AppDelegate : UIApplicationDelegate
{
// This method is invoked when the application has loaded its UI and its ready to run
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
// If you have defined a view, add it here:
// window.AddSubview (navigationController.View);
TstLib.TstCls tstCls = new TstLib.TstCls ();
Console.WriteLine ("TstLib.TstCls.Version() -> '{0}'", tstCls.Version ());
Console.WriteLine ("TstLib.TstCls.GimmeAnInt() -> '{0}'", tstCls.GimmeAnInt ());
window.MakeKeyAndVisible ();
return true;
}
// This method is required in iPhoneOS 3.0
public override void OnActivated (UIApplication application)
{
}
}
}
Этот маленький проект выполняется без двух операторов Console.Writeline. Сбой завершается без вывода, как только выполняется один из операторов Console.WriteLine.
Мы старались быть максимально краткими, предоставляя достаточно информации для воссоздания тестового примера. Мы очень готовы предоставить любую дополнительную информацию, чтобы помочь исправить это.
Кто-нибудь видит, почему это не работает, как ожидалось? Мы ограничились минимумом, чтобы проверить, можем ли мы предоставить и использовать привязку для минимального класса ObjC.
К сожалению, это не удается. И он терпит неудачу так же, как и проект MT_SampleAdMob, описанный в блоге monotouch-binding-for-admob.
В нашем небольшом проекте используется подход btouch, описанный в монотушечной точечной сети под заголовком Binding_New_Objective-C_Types, тогда как в проекте MT_SampleAdMob используется подход «вручную», описанный в том же месте.
Оба подхода терпят неудачу в аналогичном вопросе. Как только вызывается метод класса или экземпляра, приложение просто падает без какого-либо вывода.
Мы понятия не имеем, что можно сделать, чтобы точно определить эту проблему и найти решение. Monotouch предоставляет привязки c # для многих классов ObjC, поэтому это должно быть возможно. Мы тщательно изучили документы MonoTouch, упомянутые выше. Мы не можем увидеть, где MT_SampleAdMob или этот подход btouch будут отклоняться от предписанной процедуры, и все же оба не удаются!
Так что нам действительно нужна помощь ...