从C ++到C#的结构中的元数据回调

时间:2019-02-26 08:38:03

标签: c# c++ struct callback marshalling

我需要以回调和其他数据的形式返回有关对象的必要信息。

这是C#上的样子:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void ChartAddDataCallback(IntPtr data, int size);

[StructLayout(LayoutKind.Sequential)]
public struct ChartAccessors
{
    public IntPtr HWnd;
    public ChartAddDataCallback addDataCallback;
}

[DllImport("CppPart.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetAccessors")]
public static extern ChartAccessors GetAccessors();

C ++“镜像”版本如下:

typedef void(__cdecl *AddDataCallback) (int * data, int size);

struct ChartAccessors
{
    HWND m_chartHWnd;
    AddDataCallback m_addDataCallback;
};

extern "C" __declspec(dllexport) ChartAccessors GetAccessors();

用法:

static void Main(string[] args)
{
    ChartAccessors accessors = GetAccessors();
}

但是,当我启动程序时,出现异常“方法的类型签名与PInvoke不兼容”。
如果我使用任何其他返回类型(例如int或float)而不是struct,它将起作用。

1 个答案:

答案 0 :(得分:0)

Marshal.PtrToStructure实际上正在解决此问题,如Pavel所指出。

void RegisterCallbacks(IntPtr callbackPtr)
{
    ChartAccessors accessors = (ChartAccessors)Marshal.PtrToStructure(callbackPtr, typeof(ChartAccessors));
    // do stuff with the struct
}