Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Objective-C与Unity、Mono和P/Invoke进行编组_Objective C_Mono_Pinvoke_Unity3d - Fatal编程技术网

将Objective-C与Unity、Mono和P/Invoke进行编组

将Objective-C与Unity、Mono和P/Invoke进行编组,objective-c,mono,pinvoke,unity3d,Objective C,Mono,Pinvoke,Unity3d,我试着从Objective-C的角度来称呼Unity C#script。具有void参数的函数可以工作。如果另一端的脚本是Javascript,则具有字符串参数的函数可以工作 如果另一端的脚本是C#,则具有字符串参数的函数将崩溃。这次撞车是一次糟糕的事故 我很肯定我没有正确地整理参数。网络上关于这方面的文档确实不多 我读过Embedded Mono,也看过Github上非常古老的例子 https://github.com/mono/mono/tree/master/samples/embed

我试着从Objective-C的角度来称呼Unity C#script。具有void参数的函数可以工作。如果另一端的脚本是Javascript,则具有字符串参数的函数可以工作

如果另一端的脚本是C#,则具有字符串参数的函数将崩溃。这次撞车是一次糟糕的事故

我很肯定我没有正确地整理参数。网络上关于这方面的文档确实不多

我读过Embedded Mono,也看过Github上非常古老的例子

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
然后在init中:

- (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);

我相当肯定我没有正确地编组参数。这次崩溃是一次糟糕的执行。

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

您至少需要这样做:

void* args[1];

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

mono_runtime_invoke (method, NULL, args, NULL);
我只能猜测,从你的真实代码到这个问题的转录做得很差,因为你发布的代码中几乎0个是有效的


处的代码显示了当单声道字符串未输出或未被引用时如何传递单声道字符串。

崩溃是
EXC\u BAD\u ACCESS
,你的意思是?如果这是ObjC代码,那么这一行看起来非常有趣:
mono\u runtime\u invoke=(method,NULL,args,NULL)NULL
赋值给某个名为
mono\u runtime\u invoke
的变量的代码>。看起来应该是函数调用。请将您的真实代码复制粘贴到问题中。我也不知道
void*args[1]
应该是什么。unity标记是针对Microsoft unity的。不要误用它。我以前用过类似的代码从obj-c调用一个函数到unity,它成功了。现在我又需要这段代码了,我的执行能力变差了。MonMethod*runChallengeMethod为空。幸运的解决了吗?这是不正确的,因为args[0]需要是指向单字符串*的指针。您可以通过查看这里的第205行来验证这一点:@ParveenKaler:阅读该行前面的注释:“现在让我们看看如何处理采用引用参数的方法”-如果您的字符串参数不是ref/out,那么args[0]只是一个单字符串*,而不是指向它的指针。@RolfBjarneKvinge非常确定您刚刚解决了程序崩溃的原因。自从OP用真实代码更新了这个问题以来,我还没有看过它。我还想指出,您可以看到如何在问题中引用的页面上设置args。