调用C++;来自C#的dll&引用;无法封送';返回值';:无效的托管/非托管类型组合。”;

调用C++;来自C#的dll&引用;无法封送';返回值';:无效的托管/非托管类型组合。”;,c#,pinvoke,C#,Pinvoke,我的头文件 extern "C" class MyFuncs { public: __declspec(dllexport) unsigned char PassImage(unsigned char buffer, int size); }; CPP文件 unsigned char MyFuncs::PassImage(unsigned char buffer, int size) { return buffer; } 除了将缓冲区返回到主应用程序时,所有这些都可以正常

我的头文件

extern "C"  class MyFuncs
{
 public:
    __declspec(dllexport) unsigned char PassImage(unsigned char buffer, int size);
};
CPP文件

unsigned char MyFuncs::PassImage(unsigned char buffer, int size)
{
    return buffer;
}
除了将缓冲区返回到主应用程序时,所有这些都可以正常工作

    [DllImport("ExampleDLL.dll", EntryPoint = "?PassImage@MyFuncs@Funcs@@QAEXEH@Z")]
    public static extern byte[] PassImage(byte[] a, int count);
将无符号字符返回到字节[]时发生错误

如果我将byte[]改为byte,我会得到一个值,返回时没有错误

这就是确切的错误:

无法封送“返回值”:无效的托管/非托管类型 组合


我如何接受C++中的无符号char to字节[]?< /p> ,返回一个字节长的<代码>无符号char <代码>。在C#中,需要一个字节数组。您可能想从C++返回<代码>未签名的char */COD>。<代码>未签名CHAR< <代码>应该是<代码>无符号char */COD>:/P> 编辑:
您还需要传递数组的长度,并在C#中将其作为字节指针处理,因为.NET不知道数组的长度。本文描述:

在您发布的代码示例中,某些内容必须关闭。无符号字符不是数组。也许那应该是无符号字符*?除了错误使用
无符号字符
,你不能像那样返回
字节[]
。我刚把它改成了无符号字符*,仍然是相同的错误。我重复一遍,你不能像那样返回
字节[]
。我们需要了解的是您正在尝试做什么。您还需要了解什么是
unsigned char
。它是一个单标量。它不是数组。哦,还有一个实例方法也不太好。所以,现在真是一团糟。你需要后退一步,走得更慢,思考得更深入。不管怎么说,到处乱打也不会让你得逞。寻求理解。declspec(dllexport)unsigned char*PassImage(unsigned char*buffer,int size);仍然不起作用。相同错误\uuu declspec(dllexport)unsigned char*PassImage(unsigned char*buffer,int size);仍然是相同的错误。好的,那么您还需要传递数组的长度,并在C#中将其作为字节指针处理,因为.NET不知道传递的字节数组的长度(它实际上是一个指针,但您希望将其用作数组)。本文描述:您已经接受了这个答案,但它是完全错误的。不能在C端返回
字节[]
。非托管函数是一个具有
thiscall
调用约定的实例方法。将其发送到以下位置:
public:void\uu thiscall Funcs::MyFuncs::PassImage(unsigned char,int)
如果需要帮助,请告诉我!!嗨,大卫,我把它改成了无符号字符*。除了我将无符号字符*返回到C#时,它不知道长度。您接受了这个答案。我不知道为什么。它只对了一个问题,却错过了更多。如果你想进步,你需要备份并尝试理解。我看不出有什么迹象。在你这么做之前我帮不了你。