从C#调用C ++ dll。 “无法封送'返回值':无效的托管/非托管类型组合。”

时间:2015-02-09 21:04:23

标签: 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;
}

除非我将缓冲区返回给我的主应用程序,否则一切正常。

    [DllImport("ExampleDLL.dll", EntryPoint = "?PassImage@MyFuncs@Funcs@@QAEXEH@Z")]
    public static extern byte[] PassImage(byte[] a, int count);

当我将unsigned char返回到byte []时发生错误。

如果我将byte []更改为byte,则返回一个无错误的值。

这是确切的错误:

  

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

如何接受unsigned char to byte []?

2 个答案:

答案 0 :(得分:0)

unsigned char应为unsigned char *:)

编辑: 您还需要传递数组的长度并将其作为C#中的字节指针处理,因为.NET不知道它的长度。本文描述:https://stackoverflow.com/questions/8268625/get-pointer-on-byte-array-from-unman‌​aged-c-dll-in-c-sharp

答案 1 :(得分:-1)

在C ++中,您返回unsigned char,这是一个字节长。在C#中,您需要一个字节数组。您可能希望从C ++返回unsigned char *