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

如何从C#(Unity)向本机插件传递参数?,c#,unity3d,visual-c++,dll,dllimport,C#,Unity3d,Visual C++,Dll,Dllimport,C++代码: #include "stdafx.h" class myClass { __declspec(dllexport) float addMyNum(float a) { return(a); } }; 上面的代码被编译成Trail.dll并放在Unity项目的插件文件夹中 统一C#代码: 预期输出是20,但我总是得到0。 有人能帮我解决这个问题吗?在C++方面,你必须把 AddiMyNU函数从MyCase< /Cord>类中移出。这将解决函数返回0的

C++代码:

#include "stdafx.h"

class myClass
 {
  __declspec(dllexport) float addMyNum(float a)
   {
     return(a);
   }
};
上面的代码被编译成Trail.dll并放在Unity项目的插件文件夹中

统一C#代码:

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

在C++方面,你必须把<代码> AddiMyNU<代码>函数从MyCase< /Cord>类中移出。这将解决函数返回
0
的问题

另一个可能导致这个问题的是C++和C函数之间的参数不匹配。例如,当你在C++方面有这个:

DLLExport int add(int num1, int num2){ return ...}
但在C方面:

你得到不确定的行为,结果是随机的,因为C函数边上的函数只有一个参数,而C++的函数有两个参数。


不相关,但使用
EntryPoint=“?addMyNum@myClass@@AEAAMPEAM@Z“
看起来真的很奇怪。有时需要,但有时不需要,因为您需要找到函数名并将其与您需要在C#端调用的内容相匹配。你可以把你的C++函数放在代码>外部“C”< /C>中,它将确保编译器不改变函数名。
extern "C"
{
    __declspec(dllexport) float addMyNum(float a)
    {
        return(a);
    }
}
然后你的C方:


在C++侧,必须将<代码> AddiMyNU<代码>函数从MyCase< /Cuff>类中移出。这将解决函数返回
0
的问题

另一个可能导致这个问题的是C++和C函数之间的参数不匹配。例如,当你在C++方面有这个:

DLLExport int add(int num1, int num2){ return ...}
但在C方面:

你得到不确定的行为,结果是随机的,因为C函数边上的函数只有一个参数,而C++的函数有两个参数。


不相关,但使用
EntryPoint=“?addMyNum@myClass@@AEAAMPEAM@Z“
看起来真的很奇怪。有时需要,但有时不需要,因为您需要找到函数名并将其与您需要在C#端调用的内容相匹配。你可以把你的C++函数放在代码>外部“C”< /C>中,它将确保编译器不改变函数名。
extern "C"
{
    __declspec(dllexport) float addMyNum(float a)
    {
        return(a);
    }
}
然后你的C方:


入口点不应该是EntryPoint=“addMyNum”吗?另外,由于您没有重命名该函数,您也可以删除它并尝试一下。否。入口点是从.lib文件获得的。不提供它会给我一个
EntryPointNotFoundException
1。你能展示一下你把dlll放在哪里的截图吗?我知道你提到了插件文件夹,但我需要一个截图。2.你确信C++和C语言中的代码就是你所使用的吗?什么都没变?你能直接复制粘贴并在这个问题上再次验证吗?@Programmer我已经添加了截图。另外,是的,我使用的是相同的代码。入口点不应该是EntryPoint=“addMyNum”吗?另外,由于您没有重命名该函数,您也可以删除它并尝试一下。否。入口点是从.lib文件获得的。不提供它会给我一个
EntryPointNotFoundException
1。你能展示一下你把dlll放在哪里的截图吗?我知道你提到了插件文件夹,但我需要一个截图。2.你确信C++和C语言中的代码就是你所使用的吗?什么都没变?你能直接复制粘贴并在这个问题上再次验证吗?@Programmer我已经添加了截图。还有,是的,我使用相同的代码。谢谢。我会检查一下,然后告诉你。你总是帮了大忙。如果无法确保引用的函数正确,请记住也尝试
extern“C”
部分。最后,您必须在每次更新插件文件夹中的新DLL之前关闭Unity,否则Unity将使用它已加载的最后一个DLL,甚至在您点击play时覆盖新DLL,以便您可以看到代码更改。谢谢。我会检查一下,然后告诉你。你总是帮了大忙。如果无法确保引用的函数正确,请记住也尝试
extern“C”
部分。最后,您必须在每次更新插件文件夹中的新DLL之前关闭Unity,否则Unity将使用它已加载的最后一个DLL,甚至在您点击play时覆盖新DLL,以便您可以看到代码更改。
[DllImport("Trial")]
public static extern float addMyNum(float a);