簡體   English   中英

如何從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類。 這應該解決您的函數返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM