如何从C#(Unity)将参数传递给本机插件?

时间:2018-10-30 11:13:02

标签: c# unity3d visual-c++ dll dllimport

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);
  }

}

enter image description here

预期输出为20,但我总是得到0。 有人可以帮我解决这个问题吗?

1 个答案:

答案 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);