使用选择器从MonoTouch调用Obj-C

时间:2011-03-30 14:59:29

标签: objective-c xamarin.ios

嗯,我完全难倒 - 我也无法使用选择器从Mono转换为Obj-C代码。因此,作为最后的尝试,我发布了代码:

@implementation MonoWrapper
- (id)init {
self = [super init];

if (self) {
    NSBundle *main = [NSBundle mainBundle];
    NSString *path = [main bundlePath];
    const char *c_path = [path UTF8String];

    [main autorelease]; 
    [path autorelease];

    chdir (c_path);
    setenv ("MONO_PATH", c_path, 1);
    setenv ("MONO_XMLSERIALIZER_THS", "no", 1);
    setenv ("DYLD_BIND_AT_LAUNCH", "1", 1);
    setenv ("MONO_REFLECTION_SERIALIZER", "yes", 1);

    _domain = mono_jit_init_version ("MonoTouch", "v2.0.50727");
    MonoAssembly *assembly = mono_assembly_open("PhoneGap.dll", NULL);
    MonoImage *image = mono_assembly_get_image(assembly);
    MonoClass *class = mono_class_from_name(image, "PhoneGap", "PhoneGap");
    MonoMethodDesc *methodDesc = mono_method_desc_new("PhoneGap.PhoneGap:getInt", TRUE);
    _callbackMethod = mono_method_desc_search_in_class(methodDesc, class);

    /* allocate memory for the object */
    _instance = mono_object_new (_domain, class);
    /* execute the default argument-less constructor */
    mono_runtime_object_init (_instance);   

}
// Done
return self;
}

- (void)DoSomething {
int jim = 0;
} 

- (int)multiplyA:(int)a {
void *params[] = { self, @selector(DoSomething), &a };
MonoObject *result = mono_runtime_invoke(_callbackMethod, _instance, params, NULL);
int n = *(int*)mono_object_unbox (result);
return n;
}
@end

在MonoTouch中:

using System;
using MonoTouch.ObjCRuntime;  

namespace PhoneGap
{
public class PhoneGap
{
    public PhoneGap ()
    {
    }

    public int getInt(IntPtr instance, IntPtr sel, int val) {


        Messaging.void_objc_msgSend (instance, sel);
        return val * 2;
    }
}
}

有谁能告诉我如何在Mono中获取Target实例句柄以及如何获取Selector?

由于

詹姆斯

1 个答案:

答案 0 :(得分:1)

目标/实例IntPtr是指向本机实例的指针。分配课程时,你会得到这个。

对于类/静态方法,目标/实例IntPtr是本机类描述符。您可以通过创建MonoMac.ObjcRuntime.Class并使用其Handle属性来获取本机类描述符来实现此目的。

选择器IntPtr是指向选择器的指针。您可以通过创建MonoMac.ObjcRuntime.Selector并使用其Handle属性来获取本机选择器来实现此目的。

在为NSObject创建包装类时,您需要子类化NSObject并使用MonoMac.Foundation.Register属性来设置其Objc-C名称。然后,当你新建包装器时,它会分配并初始化底层的本机实例,你可以从NSObject的Handle属性中获取它。这也意味着您可以使用MonoMac.ObjcRuntime.Runtime.GetNSObject(IntPtr ptr)“解包”指向NSObjects的指针以获取1:1托管包装。

通常,您最好使用btouch工具为您生成绑定。