首页 > 解决方案 > 如何从 C#(Unity) 将参数传递给本机插件?

问题描述

C++ 代码:

#include "stdafx.h"

class myClass
 {
  __declspec(dllexport) float addMyNum(float a)
   {
     return(a);
   }
};

上述代码编译成 Trail.dll,放在 Unity 项目的 Plugin 文件夹中。

统一 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#unity3dvisual-c++dlldllimport

解决方案


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

推荐阅读