如何通过 out 参数 return 从 iOS 本机代码到 C# 的变量?

How to return a variable from iOS native code to C# through an out parameter?

这是一个函数的小代码片段,它应该 return 一个整数值 (42) 从 iOS 本机代码到 C# 通过输出参数:

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”的声明是否足以让单声道将 intVal 的值复制回来?不幸的是 docs 没有足够详细地解释它,因此非常感谢您的帮助。

试试这个:

[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

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

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

您现在正在将其作为值传递。 Google"C++ pass by value, reference and pointer"。在制作插件时,如果要修改参数,最好使用指针而不是引用。

对于 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++。了解指针、分配和取消分配内存、按值、引用或指针传递。如果不这样做,您可能会以内存泄漏和游戏中的某些未定义行为而告终。