如何通过out参数将iOS本机代码中的变量返回到C#?
下面是一个函数的小代码片段,该函数应该通过out参数从iOS本机代码返回一个整数值(42): iOS代码:如何通过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
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++中的类内封送变量时,单文档是有用的。这里不是这样,因为您只想修改参数中的变量。尽管如此,整个编组工作进展缓慢。我避免使用它们,只是使用函数来设置和获取变量。