如何将结构数组从c ++传递到c#?

时间:2013-06-19 19:58:08

标签: c# c++ pinvoke

我将结构从c ++传递给c#:

声明c ++ struct:

typedef struct _OrderUpdate {
    int32_t instrumentId;
    /* other fields */
} OrderUpdate;

声明c#struct:

public struct OrderUpdate2
{
    public int instrumentId;
    /* other fields */
}

在c ++中声明回调:

typedef void (__stdcall * OrderUpdateCallback)(OrderUpdate*);
__declspec(dllexport) void InitializeCallback(long orderUpdateCallbackAddress)

OrderUpdateCallback orderUpdateCallback = (OrderUpdateCallback) orderUpdateCallbackAddress;

并使用它:

OrderUpdate curOrderUpdate;
orderUpdateCallback(&curOrderUpdate);

在c#初始化回调和进程中:

[DllImport("NativeAdapter.dll"), SuppressUnmanagedCodeSecurity]
    public static extern void InitializeCallback(
        [MarshalAs(UnmanagedType.FunctionPtr)] OrderUpdateCallback ordersUpdateCallbackPointer)

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void OrderUpdateCallback(ref OrderUpdate2 value);

OrderUpdateCallback orderUpdateCallback = 
            delegate(ref OrderUpdate2 value)
                {
                    // do work
                };

InitializeCallback(orderUpdateCallback);

一切正常。但现在我想传递结构数组,即不是OrderUpdate而是OrderUpdate[]。我怎样才能做到这一点?请问c ++数组“映射”c#数组的方式与c ++结构映射c#结构的方式相同吗?我应该手动传递数组长度还是可以计算?我该如何更新我的功能?

可能我只能以某种方式传递void*,然后我可以花费前4个字节用于数组大小和下一个大小* sizeof(OrderUpdate)字节用于数据?

谢谢!

upd:另一个单独的问题 - 即使在最简单的情况下我也不知道如何映射数组。我无法映射基元数组。例如,有这样的c ++结构:

struct orders
{
    signed long long replID; // i8
    signed long long replRev; // i8
    signed long long replAct; // i8
    signed long long id_ord; // i8
    signed int status; // i4
    signed char action; // i1
    signed int isin_id; // i4
    signed char dir; // i1
    char price[11]; // d16.5
    signed int amount; // i4
    signed int amount_rest; // i4
    signed long long id_ord1; // i8
    signed int init_amount; // i4
};

我怎样才能将它映射到c#,我试过了:

public struct Orders
{
    public long replID; // i8
    public long replRev; // i8
    public long replAct; // i8
    public long id_ord; // i8
    public int status; // i4
    public char action; // i1
    public int isin_id; // i4
    public char dir; // i1
    public char price[11]; // d16.5    // compile error
    public int amount; // i4
    public int amount_rest; // i4
    public long id_ord1; // i8
    public int init_amount; // i4
}

但我不能在c#中声明固定大小的数组。

0 个答案:

没有答案