c# - 如何从 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++ 方面,您必须将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);
推荐阅读
- machine-learning - “normalize”和“Normalizer”之间的特征缩放差异
- java - 比较 Java 列表向量
- python - Pandas Grouping - 组内组的行数
- amazon-web-services - 不使用主键的 AppSync 解析器查询表/二级索引
- asterisk - 我想解决在 Asterisk sip 服务器上发生的错误
- linux - 使用 Perl 获取命令输入
- vba - 发生错误事件时,停止 Outlook VBA 在 ItemSend() 中发送邮件
- php - 如何将文本添加到图像动态内容
- c - 将一定数量的字节添加到 C 中的 void 指针
- c++ - c++错误:传递'const std::vector
' 作为 'this' 参数丢弃限定符 [-fpermissive]