我甚至无法使用最简单的绑定库 - 我必须做一些根本错误的事情...
我创建了一个名为“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";
}
答案 0 :(得分:3)
我通过逐步退出Binding Library项目方法,然后将我的代码基于xamarin样本套件中的BindingSample来实现这一点。
任何想要使用MonoTouch构建C#绑定到Objective-C代码的人都应该首先查看该项目中的Makefile。它概述的方法是:
- 显式编译三种体系结构的Objective-C代码(ARM6,ARM7,i386)
- 使用lipo创建单个通用静态库
- 使用btouch创建DLL并通过程序集指令(LinkWith)包含静态库 - 请参阅AssemblyInfo.cs 项目 - 以及通过--link-with在btouch命令行中 选项。
醇>
我个人发现创建ApiDefinition.cs包装器的过程相当简单,但是有一些常见错误 - 例如忘记带有一个参数的选择器上的尾部冒号。