2010-11-23 127 views
4

綁定的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方法在哪裏偏離了規定的程序,但都失敗了!

真的,我們迫切需要一些幫助在這裏...

回答

6

您可能沒有禁用本地庫的THUMB模式。自從iOS SDK 3.0以來,蘋果鏈接器在將Thumb庫鏈接到大型項目時遇到了問題。

您可以通過在Xcode中打開你的本地庫,並執行以下操作禁用Thumb模式:

  1. 項目 - >編輯項目設置
  2. 類型「拇指」,在「搜索在構建設置」
  3. 取消選中框
  4. 重建您的本機庫。
+0

傑夫, 當然,你是對的。我忘了拇指的事情。我曾看到有關此方面的帖子,但從未看到有關此方面的明確簡明解釋。將這個應用到我的小測試庫後,iPhone測試成功了。 因此,我現在將嘗試爲AdMob庫解決此問題,並且我會在此處發佈我的發現。 感謝您的幫助, Mollyke。 – guivho 2010-11-24 08:41:59