Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.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
如何通过out参数将iOS本机代码中的变量返回到C#?_C#_Ios_C_Unity3d_Mono - Fatal编程技术网

如何通过out参数将iOS本机代码中的变量返回到C#?

如何通过out参数将iOS本机代码中的变量返回到C#?,c#,ios,c,unity3d,mono,C#,Ios,C,Unity3d,Mono,下面是一个函数的小代码片段,该函数应该通过out参数从iOS本机代码返回一个整数值(42): iOS代码: extern "C" { void _GetInt(int intVal) { intVal = 42; } } [DllImport("__Internal")] private static extern void _GetInt([Out] int retVal); public static void getInt() { int int

下面是一个函数的小代码片段,该函数应该通过out参数从iOS本机代码返回一个整数值(42):

iOS代码:

extern "C" {
    void _GetInt(int intVal) {
        intVal = 42;
    }
}
[DllImport("__Internal")]
private static extern void _GetInt([Out] int retVal);

public static void getInt() {
    int intVal = 1234;
    if (Application.platform == RuntimePlatform.IPhonePlayer) {
        _GetInt(intVal); 
        Debug.Log("intVal: "+intVal);
    }
}
C#代码(单声道/单声道):

extern "C" {
    void _GetInt(int intVal) {
        intVal = 42;
    }
}
[DllImport("__Internal")]
private static extern void _GetInt([Out] int retVal);

public static void getInt() {
    int intVal = 1234;
    if (Application.platform == RuntimePlatform.IPhonePlayer) {
        _GetInt(intVal); 
        Debug.Log("intVal: "+intVal);
    }
}
现在,当调用getInt()时,intVal的值保持在1234,而不是变成42

你知道这里怎么了吗?难道“[Out]int-retVal”的声明不足以让mono复制回intVal的值吗?不幸的是,我们没有详细解释,因此非常感谢您的帮助。

尝试以下方法:

[DllImport("__Internal")]
private static extern void _GetInt([MarshalAs(UnmanagedType.I8, Out()] out int retVal);

下面列出了更多的
非托管类型:

看起来更像C/C++函数,而不是Object-C

无论如何,要修改参数中的值,必须将其作为引用或指针传递

您现在正在将其作为值传递。谷歌“C++传递值、引用和指针”。制作插件时,如果希望修改参数,最好使用指针而不是引用

对于C#使用
out
而不是
[out]
。它们之间有区别,
[Out]
在性能方面更慢,尤其是在传递数组时,因为编译器将自动为您执行一些操作

C++:(注意
*
intVal
之前):

C#:


最后,根据你的最后一个问题,我建议你在继续使用插件之前先学习C和C++。理解指针、分配和取消分配内存、按值传递、引用或指针。如果您不这样做,您可能会在游戏中出现内存泄漏和一些未定义的行为。

Kyle,谢谢您分享!还是一样的问题。。。顺便说一句,在“.I8”后面似乎缺少一个“')。你还有别的想法吗?也许它与Mono/Unity有关?谢谢您的详细解释!尤其是那些关于彻底的细节是非常有价值的。顺便说一句,你是对的,这是c代码,我只是想把这个例子保持在最低限度。同时也感谢您提出的关于先学习C/C++基础知识的建议。看,问题是,我对指针、引用、C/C++甚至汇编都有清晰的理解。我的问题源于对编组时C#中发生的事情缺乏了解。不幸的是,Mono的文档在这方面没有太大帮助。再次感谢您的详细解释!好啊那你就可以走了。当在C++中的类内封送变量时,单文档是有用的。这里不是这样,因为您只想修改参数中的变量。尽管如此,整个编组工作进展缓慢。我避免使用它们,只是使用函数来设置和获取变量。