gpt4 book ai didi

c# - "stack around the variable is corrupted"在 c++ 到 c# 回调期间

转载 作者:行者123 更新时间:2023-11-27 23:14:36 28 4
gpt4 key购买 nike

我声明这样的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)

最佳答案

最有可能的是,堆栈损坏是由于您错误地假设 C# 中的 char 类型与 C++ 中的大小相同。 C# 中的 char 是一个 UTF-16 代码点。参见 MSDN了解详情。如果您想要类似于 C++ 字符的东西,请考虑 bytesbyte

关于c# - "stack around the variable is corrupted"在 c++ 到 c# 回调期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17220966/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com