1

我以这种方式将结构从 c++ 传递到 c#:

声明 c++ 结构:

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

声明 c# 结构:

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);

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

也许我可以通过void*某种方式,然后我可以将前 4 个字节用于数组大小,然后将下一个 size * 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# 中声明固定大小的数组。

4

0 回答 0