如何在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#中声明结构;内核内核二
如果可能的话,我总是会避免不安全,因为不安全的代码是不安全的。在这种情况下很有可能避免:
[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"