[英]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.