[英]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
类。 这应该解决您的函数返回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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.