MonoTouch:从Obj-C谈到MonoTouch

时间:2011-03-29 13:07:49

标签: xcode xamarin.ios

我正在尝试从现有的Objective C项目调用MonoTouch程序集。我找到了这篇文章:

http://www.guidebee.biz/forum/redirect.php?fid=16&tid=176&goto=nextoldset

在那里它几乎非常好地描述了这些步骤,但是当我尝试在XCode中构建项目时,我收到以下错误:

错误:没有指定名称或路径的SDK'/Developer/MonoTouch/SDKs/MonoTouch.iphonesimulator.sdk'

所以,要明确:

  1. 我有正确的路径添加了架构附加SDK
  2. 物理检查路径是否正确
  3. 我正在构建最新的SDK(我还有),这是iOS 4.2
  4. 我很难过。这是XCode无法找到SDK的正确路径或更深层次的问题吗?令人担忧的是我注意到文章中引用的URL(http://monotouch.net/Documentation/XCode)现在已经丢失了 - 所以Novell MonoTouch因某种原因故意删除了这个吗?

    更新

    嗯,我完全难倒 - 我也无法使用选择器从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
    

    在Mono中:

    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)

MonoTouch历史上包含了我们拥有自己的调试器之前的支持。我们已经弃用了这种支持,因为我们现在拥有一个完全成熟的调试器。您尝试做什么,虽然技术上可行,但不支持工作流程。如果您希望继续沿着这条路走下去,我建议使用MonoTouch的“-keeptemp”标志和“-v -v -v”,它们不会删除我们在编译项目时生成的临时文件。

使用此信息,您可以提取main.m模板,理论上可以找出如何调用arm-darwin-mono来自行交叉编译。