如何将参数从 C#(Unity) 传递到本机插件?
How do I pass parameters to a native plugin from C#(Unity)?
C++代码:
#include "stdafx.h"
class myClass
{
__declspec(dllexport) float addMyNum(float a)
{
return(a);
}
};
以上代码编译成Trail.dll放在Unity工程的Plugin文件夹下
Unity C# 代码:
using UnityEngine;
using System.Runtime.InteropServices;
public class ndstryscript : MonoBehaviour {
[DllImport("Trial", EntryPoint = "?addMyNum@myClass@@AEAAMPEAM@Z")]
private static extern float addMyNum(float a);
void Start ()
{
float b = addMyNum(20);
Debug.Log(b);
}
}
预期输出为 20,但我总是得到 0。
有人可以帮我解决这个问题吗?
在 C++ 方面,您必须将 addMyNum
函数移出 myClass
class。这应该可以解决您的函数 return 0
问题。
另一个可能导致此问题的原因是 C++ 和 C# 函数之间的参数数量不匹配。例如,当你在 C++ 端有这个时:
DLLExport int add(int num1, int num2){ return ...}
但是在 C# 方面:
[DllImport("FirstDLL")]
public static extern int add(int num1);
你会得到未定义的行为结果将是随机的,因为 C# 端的函数有一个参数,而 C++ 端的函数有两个。
无关,但使用 EntryPoint = "?addMyNum@myClass@@AEAAMPEAM@Z"
看起来确实很奇怪。有时需要,但有时不需要,因为您必须找到函数名称并将其与您需要在 C# 端调用的内容相匹配。您可以将 C++ 函数放在 extern "C"
中,这将确保编译器不会更改函数名称。
extern "C"
{
__declspec(dllexport) float addMyNum(float a)
{
return(a);
}
}
那么你的 C# 端:
[DllImport("Trial")]
public static extern float addMyNum(float a);
C++代码:
#include "stdafx.h"
class myClass
{
__declspec(dllexport) float addMyNum(float a)
{
return(a);
}
};
以上代码编译成Trail.dll放在Unity工程的Plugin文件夹下
Unity C# 代码:
using UnityEngine;
using System.Runtime.InteropServices;
public class ndstryscript : MonoBehaviour {
[DllImport("Trial", EntryPoint = "?addMyNum@myClass@@AEAAMPEAM@Z")]
private static extern float addMyNum(float a);
void Start ()
{
float b = addMyNum(20);
Debug.Log(b);
}
}
预期输出为 20,但我总是得到 0。 有人可以帮我解决这个问题吗?
在 C++ 方面,您必须将 addMyNum
函数移出 myClass
class。这应该可以解决您的函数 return 0
问题。
另一个可能导致此问题的原因是 C++ 和 C# 函数之间的参数数量不匹配。例如,当你在 C++ 端有这个时:
DLLExport int add(int num1, int num2){ return ...}
但是在 C# 方面:
[DllImport("FirstDLL")]
public static extern int add(int num1);
你会得到未定义的行为结果将是随机的,因为 C# 端的函数有一个参数,而 C++ 端的函数有两个。
无关,但使用 EntryPoint = "?addMyNum@myClass@@AEAAMPEAM@Z"
看起来确实很奇怪。有时需要,但有时不需要,因为您必须找到函数名称并将其与您需要在 C# 端调用的内容相匹配。您可以将 C++ 函数放在 extern "C"
中,这将确保编译器不会更改函数名称。
extern "C"
{
__declspec(dllexport) float addMyNum(float a)
{
return(a);
}
}
那么你的 C# 端:
[DllImport("Trial")]
public static extern float addMyNum(float a);