1

我正在尝试从 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。

4

1 回答 1

0

我建议您详细说明您发布的代码。使用您发布的代码,假设“...”已正确实现,您正在执行一个带有 1 个未定义参数的静态方法。

你至少需要这样做:

void* args[1];

args[0] = mono_string_new(domain, msg.UTF8String);

mono_runtime_invoke (method, NULL, args, NULL);

我只能猜测从你的真实代码到这个问题的转录做得很差,因为你发布的几乎 0 代码是有效的。

http://www.mono-project.com/Embedding_Mono#Creating_objects上的代码显示了如何在 Mono 字符串未输出或通过 ref 时传递它们。

于 2012-05-22T00:16:18.440 回答