如何将参数从 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 class。这应该可以解决您的函数 return 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);