来自 C/C++ 的 C# Interop 上的堆损坏

问题描述 投票:0回答:0

我正在尝试在 C# 中使用 C/C++ 模块,但在互操作方面存在一些问题。我通常不使用 C# 并且不熟悉这些项目,但是使用了互操作文档,当涉及到可变大小的结构时,它似乎无处不在。

目前,我遇到了堆损坏,这导致 VS2022 无限期冻结(另一个问题)。我有以下 C++ 函数定义,我正试图开始工作。

C 函数

InfoItem GetInfoItem(const ULONG32 Index)

C 中的 InfoItem 结构

struct InfoItem
{
ULONG64 Flags;
ULONG32 Flags2;
ULONG32 TimeStamp;
ULONG32 SizeOfName;
WCHAR* Name
}

我已经将其翻译成以下 C# 结构

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct InfoItem
{
public ulong Flags;
public uint Flags2;
public uint TimeStamp;
public uint SizeOfName;
[MarshalAs(UnmanagedType.LPWStr)]
public string Name;
}

使用了以下互操作定义

[DllImport("InfoItem64.dll", CharSet = CharSet.Unicode)]
private static extern InfoItem GetInfoItem(ulong Index);

然后使用下面的C#代码

InfoItem test = new InfoItem();
test = GetInfoItem(0);

到目前为止,这不可避免地导致 VS2022 冻结。尝试在 VS 之外运行它会导致堆损坏,这告诉我我没有分配适当的空间 - 很可能是结构中的字符串,因为它的大小是可变的。

c# c++ c interop
© www.soinside.com 2019 - 2024. All rights reserved.