我将结构从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#中声明固定大小的数组。