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

时间:2017-06-11 12:28:00

标签: c# ios c unity3d mono

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

iOS代码:

extern "C" {
    void _GetInt(int intVal) {
        intVal = 42;
    }
}

C#代码(Mono / Unity):

[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的值吗?不幸的是,docs没有详细说明,所以非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

您现在正在将其作为值传递。 Google " C ++通过值,引用和指针传递#34; 。在制作插件时,如果要修改参数,最好使用指针而不是引用。

对于C#使用out而不是[Out]。它们之间存在差异,[Out]在性能方面较慢,尤其是在传递数组时,因为编译器会自动为您做一些事情。

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

extern "C" {
    void _GetInt(int *intVal) {
        *intVal = 42;
    }
}

C#

[DllImport("__Internal")]
private static extern void _GetInt(out int retVal);

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

答案 1 :(得分:0)

试试这个:

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

以下是更多UnmanagedType的列表:https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype(v=vs.110).aspx