0

そのような 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
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
    public char[] price; // d16.5
    public int amount; // i4
    public int amount_rest; // i4
    public long id_ord1; // i8
    public int init_amount; // i4
}

C++ から構造体を渡します。

__declspec(dllexport) void InitializeCallbacks(OrdersCallback ordersCallbackAddress_) {

OrdersCallback ordersCallbackFunction = ordersCallbackAddress_;
orders test;
test.init_amount = 123;
ordersCallbackFunction(&test);
}

C# へ:

        OrdersCallback ordersCallback =
            delegate(ref Orders value)
            {
                Console.WriteLine("C# Orders call received = " +
                    " init_amount = " + value.init_amount);
            };
        InitializeCallbacks(ordersCallback);

コンソールで "init_amount = 123" を読むことができます。これは、呼び出しが期待どおりに機能し、構造が正しく配置されていることを証明していると思います。ただし、デバッグ中に次のエラーが表示されます: 「実行時チェックの失敗 #2 - 変数の周りのスタックtestが壊れています。」

この行にコメントするとordersCallbackFunction(&test);、エラーはなくなります。コードの何が問題になっていますか?

upd私はC ++側で私が持っていることを言及するのを忘れていました#pragma pack(push, 4)

4

2 に答える 2

3

charほとんどの場合、スタックの破損は、C# の型が C++ の型と同じサイズであるという誤った仮定が原因です。charC# では UTF-16 コードポイントです。詳細については、 MSDNを参照してください。C++ char に似たものが必要な場合は、byteorを検討してsbyteください。

于 2013-06-20T18:26:37.717 に答える