绑定的ObjectiveC类的C#问题

问题描述:

绑定的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方法在哪里偏离了规定的程序,但都失败了!

真的,我们迫切需要一些帮助在这里...

您可能没有禁用本地库的THUMB模式。自从iOS SDK 3.0以来,苹果链接器在将Thumb库链接到大型项目时遇到了问题。

您可以通过在Xcode中打开你的本地库,并执行以下操作禁用Thumb模式:

  1. 项目 - >编辑项目设置
  2. 类型“拇指”,在“搜索在构建设置”
  3. 取消选中框
  4. 重建您的本机库。
+0

杰夫, 当然,你是对的。我忘了拇指的事情。我曾看到有关此方面的帖子,但从未看到有关此方面的明确简明解释。将这个应用到我的小测试库后,iPhone测试成功了。 因此,我现在将尝试为AdMob库解决此问题,并且我会在此处发布我的发现。 感谢您的帮助, Mollyke。 – guivho 2010-11-24 08:41:59