我正在尝试从现有的Objective C项目调用MonoTouch程序集。我找到了这篇文章:
http://www.guidebee.biz/forum/redirect.php?fid=16&tid=176&goto=nextoldset
在那里它几乎非常好地描述了这些步骤,但是当我尝试在XCode中构建项目时,我收到以下错误:
错误:没有指定名称或路径的SDK'/Developer/MonoTouch/SDKs/MonoTouch.iphonesimulator.sdk'
所以,要明确:
我很难过。这是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?
答案 0 :(得分:1)
MonoTouch历史上包含了我们拥有自己的调试器之前的支持。我们已经弃用了这种支持,因为我们现在拥有一个完全成熟的调试器。您尝试做什么,虽然技术上可行,但不支持工作流程。如果您希望继续沿着这条路走下去,我建议使用MonoTouch的“-keeptemp”标志和“-v -v -v”,它们不会删除我们在编译项目时生成的临时文件。
使用此信息,您可以提取main.m模板,理论上可以找出如何调用arm-darwin-mono来自行交叉编译。