我正在尝试从 Objective-C 端调用 Unity C# 脚本。带有 void 参数的函数可以工作。如果另一端的脚本是 Javascript,则带有字符串参数的函数可以工作。
如果另一端的脚本是 C#,则带有字符串参数的函数会崩溃。崩溃是 BAD_EXEC。
我很确定我没有正确地编组参数。网络上确实没有太多关于此的文档。
我已经阅读了 Embedding Mono 并查看了 Github 上非常古老的示例。
http://www.mono-project.com/Embedding_Mono https://github.com/mono/mono/tree/master/samples/embed
类型和函数声明如下:
typedef void* MonoDomain;
typedef void* MonoAssembly;
typedef void* MonoImage;
typedef void* MonoClass;
typedef void* MonoObject;
typedef void* MonoMethodDesc;
typedef void* MonoMethod;
typedef void* MonoString;
typedef int gboolean;
MonoDomain* mono_domain_get();
MonoAssembly* mono_domain_assembly_open(MonoDomain* domain, const char *assemblyName);
MonoImage* mono_assembly_get_image(MonoAssembly* assembly);
MonoMethodDesc* mono_method_desc_new(const char* methodString, gboolean useNamespace);
MonoMethodDesc* mono_method_desc_free(MonoMethodDesc* desc);
MonoMethod* mono_method_desc_search_in_image(MonoMethodDesc* methodDesc, MonoImage* image);
MonoObject* mono_runtime_invoke(MonoMethod* method, void* obj, void** params, MonoObject** exc);
MonoClass* mono_class_from_name (MonoImage *image, const char* name_space, const char *name);
MonoString* mono_string_new(MonoDomain* domain, const char* str);
然后声明变量:
@interface UnityObject : NSObject
{
MonoDomain* domain;
NSString* assemblyPath;
MonoAssembly* monoAssembly;
MonoImage* monoImage;
MonoMethodDesc* runChallengeDesc;
MonoMethod* runChallengeMethod;
}
@end
然后在初始化中:
- (id)init
{
if ((self = [super init]))
{
assemblyPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Data/Managed/Assembly-CSharp-firstpass.dll"];
domain = mono_domain_get();
monoAssembly = mono_domain_assembly_open(domain, assemblyPath.UTF8String);
monoImage = mono_assembly_get_image(monoAssembly);
runChallengeDesc = mono_method_desc_new("Marshal:RunChallenge(string)", FALSE);
runChallengeMethod = mono_method_desc_search_in_image(runChallengeDesc, monoImage);
mono_method_desc_free(runChallengeDesc);
}
return self;
}
以上所有工作都按预期工作。
然后调用该方法:
NSString *msg = @"Some message string";
MonoString *str = mono_string_new(domain, msg.UTF8String);
void *args[1];
args[0] = &str;
if (runChallengeMethod)
mono_runtime_invoke(runChallengeMethod, NULL, args, NULL);
我很确定我没有正确地编组参数。崩溃是 BAD_EXEC。