綁定的ObjectiveC類的C#問題綁定的ObjectiveC類的C#問題
MonoTouch的項目介紹瞭如何綁定的ObjectiveC類型與MonoTouch的使用。我們沒能做到這一點對AdMob的庫(也見monotouch-binding-for-admob blog at 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並與btouch實用程序TstLib.dll文件:
/Developer/MonoTouch/usr/bin/btouch -o TstLib.dll TstCls.cs
現在,我們創建一個新的MonoTouch的基於窗口的iPhone應用程序 '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類提供和使用綁定。
不幸的是,它失敗了。它的失敗方式與monotouch-binding-for-admob博客中介紹的MT_SampleAdMob項目相同。
我們的小項目使用標題爲Binding_New_Objective-C_Types的monotouch dot net中描述的btouch方法,而MT_SampleAdMob項目使用在同一位置描述的「手動」方法。
這兩種方法在類似的事情上都失敗了。只要調用類或實例方法,應用程序就會崩潰而沒有任何輸出。
我們不知道可以做些什麼來找出問題並找到解決辦法。 Monotouch提供了許多ObjC類的c#綁定,所以它必須是可能的。我們仔細研究了上面引用的MonoTouch文檔。我們無法看到MT_SampleAdMob或這種btouch方法在哪裏偏離了規定的程序,但都失敗了!
真的,我們迫切需要一些幫助在這裏...
傑夫, 當然,你是對的。我忘了拇指的事情。我曾看到有關此方面的帖子,但從未看到有關此方面的明確簡明解釋。將這個應用到我的小測試庫後,iPhone測試成功了。 因此,我現在將嘗試爲AdMob庫解決此問題,並且我會在此處發佈我的發現。 感謝您的幫助, Mollyke。 – guivho 2010-11-24 08:41:59