Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XCode静态库和monotouch绑定_C#_Objective C_Ios_Binding_Xamarin.ios - Fatal编程技术网

C# XCode静态库和monotouch绑定

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

我在xcode中有一个简单的静态库,只有一个类 测试h:

测试m:

@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是可能的。那真的很有用!