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

che*_*nwq 1 c# delphi pinvoke struct record

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

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

TShell = packed record
  Kernels: TKernels;
end;
Run Code Online (Sandbox Code Playgroud)

在这,

SizeOf(TShell) = 20 * SizeOf(TKernel).
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用C#:

struct Shell
{
    Kernel[] Kernels;
    public Shell(int i = 20)
    {
        Kernels = new Kernel[20];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:Marshal.SizeOf(Shell)== 4

这意味着内核只是一个指针.我想互操作C#与德尔福,所以我需要有存储结构是一样的,所以我应该如何申报在C#中的结构,除了写20个喜欢内核KernelOne的; 内核内核两个......

Dav*_*nan 7

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

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Kernel
{
    int State;
}

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Shell
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]
    Kernel[] Kernels;
}
Run Code Online (Sandbox Code Playgroud)