这是一个函数的一小段代码片段,它应该通过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没有详细说明,所以非常感谢您的帮助。
答案 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