我正在尝试在 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 之外运行它会导致堆损坏,这告诉我我没有分配适当的空间 - 很可能是结构中的字符串,因为它的大小是可变的。