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。 有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
在C ++方面,您必须将addMyNum
函数移出myClass
类。这应该可以解决函数返回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);