我以这种方式将结构从 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 OrderUpdate
but 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# 中声明固定大小的数组。