如何在C#中声明一个嵌入的结构,就像在delphi中声明一条嵌入的记录一样

本文关键字:声明 delphi 记录 一样 一条 结构 一个 | 更新日期: 2023-09-27 18:25:42

我在delphi中有一个嵌入的记录,如下所示:

TKernel = packed record
    State: Integer;
end;
TKernels = array[0..19] of TKernel;
TShell = packed record
  Kernels: TKernels;
end;

在这方面,

SizeOf(TShell) = 20 * SizeOf(TKernel).

但是如果我使用C#:

struct Shell
{
    Kernel[] Kernels;
    public Shell(int i = 20)
    {
        Kernels = new Kernel[20];
    }
}

那么:Marshal.SizeOf(外壳)==4

这意味着Kernels只是一个指针。我想将C#与Delphi进行InterOp,所以我需要内存结构是相同的,那么除了写20个Kernel KernelOne之外,我还应该如何在C#中声明结构;内核内核二

如何在C#中声明一个嵌入的结构,就像在delphi中声明一条嵌入的记录一样

如果可能的话,我总是会避免不安全,因为不安全的代码是不安全的。在这种情况下很有可能避免:

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Kernel
{
    int State;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Shell
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]
    Kernel[] Kernels;
}

您可以使用fixed关键字在不安全的代码中执行此操作:

unsafe struct Shell
{
    public fixed Kernel Kernels[20];
}

编辑

根据"固定大小缓冲区"的文档,fixed的使用是在C#2.0中添加的

编辑2

而且,oops,您只能创建基元类型的固定大小缓冲区;正如文档所述,"唯一的限制是数组类型必须是bool、byte、char、short、int、long、sbyte、ushort、uint、ulong、float或double"