如何通过 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++。了解指针、分配和取消分配内存、按值、引用或指针传递。如果不这样做,您可能会以内存泄漏和游戏中的某些未定义行为而告终。
这是一个函数的小代码片段,它应该 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++。了解指针、分配和取消分配内存、按值、引用或指针传递。如果不这样做,您可能会以内存泄漏和游戏中的某些未定义行为而告终。