C# XCode静态库和monotouch绑定
我在xcode中有一个简单的静态库,只有一个类 测试h: 测试m:C# XCode静态库和monotouch绑定,c#,objective-c,ios,binding,xamarin.ios,C#,Objective C,Ios,Binding,Xamarin.ios,我在xcode中有一个简单的静态库,只有一个类 测试h: 测试m: @implementation TestClass @synthesize SomeString; - (id)init { if ((self = [super init]) == nil) return nil; SomeString = @"test string value"; return self; } - (NSString *) getString { re
@implementation TestClass
@synthesize SomeString;
- (id)init
{
if ((self = [super init]) == nil)
return nil;
SomeString = @"test string value";
return self;
}
- (NSString *) getString {
return @"Lorem ipsum dolor sit amet";
}
- (int) getInt {
return 123;
}
@end
我已经从btouch生成的dll复制了TstClass。如果我使用原始dll的实现:
[Register ("TestClass", true)]
public class TstClass : NSObject
变量Handle、ClassHandle等都是null,但应用程序运行并返回null作为getInt、getString和SomeString。如果我将定义更改为
[Register ("TestClass")]
public class TstClass : NSObject
内部变量是有效的,表示不为null,但当我试图调用TstClass的函数时,应用程序崩溃,没有输出
在我的研究过程中,我发现有人通过在XCode构建设置中取消选中thumb选项来解决这个问题,但我在XCode项目中找不到任何类似thumb的东西。以防万一:XCode 4.2构建4C199;我正在使用最新版本的Monotouch
如何在xcode中创建静态库并与monotouch一起使用?我的代码怎么了
最后一个问题:我有一个.a和它的.h文件。是否有更简单的方法从库文件和头文件生成绑定?绑定库的最简单方法是使用绑定生成器这是作为MonoTouch一部分的B触摸工具: 详细文件如下: 变量为null的原因是您没有正确初始化库ClassHandle,因为它是一个虚拟方法,在本例中,该方法应该从Class.GetHandle ClassName返回返回值 将以下契约文件与btouch一起使用以生成适当的绑定:
using MonoTouch.Foundation;
using MonoTouch.ObjCRuntime;
namespace AlexD {
[BaseType (typeof (NSObject))]
interface TestClass {
[Export ("SomeString")] string SomeString { get; set; }
[Export ("getString")] string GetString ();
[Export ("getInt")] int GetInt ();
}
}
将其保存到AlexD.cs中,然后运行:
/Developer/MonoTouch/usr/bin/mtouch AlexD.cs
这将生成包含到本机库的绑定的AlexD.dll。您可以将此参数和一组适当的命令行参数用于mtouch来访问库
您还可以将本机库绑定到DLL中,以简化分发。DLL将同时包含C绑定和本机库,有关如何执行此操作的详细信息,请参阅:
绑定库的最简单方法是使用绑定生成器这是作为MonoTouch一部分的btouch工具: 详细文件如下: 变量为null的原因是您没有正确初始化库ClassHandle,因为它是一个虚拟方法,在本例中,该方法应该从Class.GetHandle ClassName返回返回值 将以下契约文件与btouch一起使用以生成适当的绑定:
using MonoTouch.Foundation;
using MonoTouch.ObjCRuntime;
namespace AlexD {
[BaseType (typeof (NSObject))]
interface TestClass {
[Export ("SomeString")] string SomeString { get; set; }
[Export ("getString")] string GetString ();
[Export ("getInt")] int GetInt ();
}
}
将其保存到AlexD.cs中,然后运行:
/Developer/MonoTouch/usr/bin/mtouch AlexD.cs
这将生成包含到本机库的绑定的AlexD.dll。您可以将此参数和一组适当的命令行参数用于mtouch来访问库
您还可以将本机库绑定到DLL中,以简化分发。DLL将同时包含C绑定和本机库,有关如何执行此操作的详细信息,请参阅:
花了一些时间才弄明白如何使它起作用 确保lib和app目标体系结构相同。我有用于lib的armv7和用于app的armv6 确保构建目标与lib的was iOS设备和app的iOS模拟器相同。iOS模拟器目标将架构设置为i386,这使得lib和app构建不兼容 出于某些原因,额外的mtouch参数需要-cxx-gcc_标志,而不仅仅是-gcc_标志 出于某种原因。没有-force_load参数,库无法链接 将-v-v-v添加到其他mtouch参数以查看完整的生成日志。这对找到这个解决方案有很大帮助 必须通过添加用户定义的项目选项GCC\u Thumb\u支持来禁用Thumb指令集:否
就这样 花了一些时间才弄明白如何让它工作 确保lib和app目标体系结构相同。我有用于lib的armv7和用于app的armv6 确保构建目标与lib的was iOS设备和app的iOS模拟器相同。iOS模拟器目标将架构设置为i386,这使得lib和app构建不兼容 出于某些原因,额外的mtouch参数需要-cxx-gcc_标志,而不仅仅是-gcc_标志 出于某种原因。没有-force_load参数,库无法链接 将-v-v-v添加到其他mtouch参数以查看完整的生成日志。这对找到这个解决方案有很大帮助 必须通过添加用户定义的项目选项GCC\u Thumb\u支持来禁用Thumb指令集:否
就这样 谢谢,我不知道在最终的dll中嵌入.a是可能的。那真的很有用!谢谢,我不知道在最终的dll中嵌入.a是可能的。那真的很有用!