PInvoke错误将C ++ dll封送到C#中,将struct传递给方法

时间:2018-04-13 10:22:05

标签: c# c++ struct marshalling unmarshalling

大家好我正在尝试将C ++项目编译成DLL,然后使用C#中的Structs和方法。我制作了一个openCV程序,我需要来回传递数据。现在我正在尝试简单的事情来熟悉这门语言,因为这是我第一次接触C ++和C#...

所以在C ++中我有:

#pragma pack(push, 2)  
typedef struct 
{
//char *plate;
unsigned int width;
unsigned int height;
//bool hasPlateOn;
//unsigned char *imgData;
} Sframe;
extern "C" Sframe MYCVAPI findPossiblePlates(Sframe& in)

我尝试使用C#中的这个:

 [StructLayout(LayoutKind.Sequential)]
    struct Sframe
    {
       // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
       // char[] plate;
        [MarshalAs(UnmanagedType.U4)]
        int width;
        [MarshalAs(UnmanagedType.U4)]
        int height;
       // bool hasPlateOn;
      //  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
      //  char[] imgData;
    }

  [DllImport(@"ALPR_pwv.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint = "findPossiblePlates")]
    static extern Sframe findPossiblePlates(Sframe infoOut);

但无论我尝试什么,我都会得到错误,方法的类型签名不是PInvoke兼容的。

有没有人可以帮助我理解这个问题?

是否可以在C ++和C#中传递和获取自定义结构?

因为我必须使用坐标等数据传递图像,所以最终的结构会复杂得多......

1 个答案:

答案 0 :(得分:0)

正如@SaniSinghHuttunen所说,我错过了ref关键字,不得不使用MarshalAs.U4 ......再次感谢:)