无法让MonoTouch绑定库工作

时间:2012-02-23 23:03:58

标签: objective-c ios xamarin.ios

我甚至无法使用最简单的绑定库 - 我必须做一些根本错误的事情...

我创建了一个名为“TestLib”的Xcode项目,如下所示:

//  TestLib.h
#import <Foundation/Foundation.h>
@interface TestLib : NSObject
{
    NSString *status;
}
@property (nonatomic,retain) NSString *status;
@end

//  TestLib.m
#import "TestLib.h"
@implementation TestLib
@synthesize status;
- (id)init
{
    self = [super init];
    if (self) {
        [self setStatus:@"initialized"];
    }

    return self;
}
@end

项目在这里:http://dl.dropbox.com/u/31924320/TestLib.tar.gz

我把它编译成“libTestLib.a”。

然后我创建了最简单的绑定库(以及“单视图应用程序”来测试它),它只是初始化TestLib类并调用status属性的getter。我将库(libTestLib.a)添加到绑定库中,因此它具有LinkWith文件/程序集指令。 ApiDefinition.cs文件如下所示:

namespace TestLibBinder
{
      [BaseType(typeof(NSObject))]
      interface TestLib
      {
            [Export("status")]
            string Status { get; set; }
      }
}

该项目在此处:http://dl.dropbox.com/u/31924320/BindingTest.tar.gz

不幸的是,当我尝试获取Status属性时,我从库中获得了一个空引用...

        public override void ViewDidLoad ()
        {
              base.ViewDidLoad ();

              TestLib testLib = new TestLib();  // succeeds!
              string status = testLib.Status;  // got a null reference

              if (status != null)
                    label.Text = status;
              else
                    label.Text = "binding failed";                  
        }

1 个答案:

答案 0 :(得分:3)

我通过逐步退出Binding Library项目方法,然后将我的代码基于xamarin样本套件中的BindingSample来实现这一点。

任何想要使用MonoTouch构建C#绑定到Objective-C代码的人都应该首先查看该项目中的Makefile。它概述的方法是:

  
      
  1. 显式编译三种体系结构的Objective-C代码(ARM6,ARM7,i386)
  2.   
  3. 使用lipo创建单个通用静态库
  4.   
  5. 使用btouch创建DLL并通过程序集指令(LinkWith)包含静态库 - 请参阅AssemblyInfo.cs   项目 - 以及通过--link-with在btouch命令行中   选项。
  6.   

我个人发现创建ApiDefinition.cs包装器的过程相当简单,但是有一些常见错误 - 例如忘记带有一个参数的选择器上的尾部冒号。