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

标签 c# c++

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

相关文章:

c# - .NET 中类型的定义

c++ - 关于 char 指针,sizeof 运算符如何工作?

C++ 结构值初始化

c# - 在 asp.net gridview 中更改选定行的颜色

c# - 正则表达式匹配由 '!' 分隔并括在大括号 '{' '}' 之间的单词

c# - SortedDictionary (C#)- 改变值

c# - ASP.NET Razor Pages - 条件重定向

c++ - 将基类对象转换为派生类

c++ - 将子序列问题的复杂性从指数降低到多项式?

c++ - 构建 ADO Recordset 时是否将数据拉入内存?