Как мне объявить встроенную структуру в C # как встроенную запись в delphi? - PullRequest
1 голос
/ 24 февраля 2012

У меня есть встроенная запись в 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 (Shell) == 4

это означает, что Ядра - это просто указатель. Я хочу InterOp C # с Delphi, поэтому мне нужно, чтобы структура памяти была такой же, так как я должен объявить структуру в C #, кроме записи 20 подобий Kernel KernelOne; Kernel KernelTwo 。。。

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

Я бы всегда избегал небезопасных, если это вообще возможно, поскольку небезопасный код, ну, в общем, небезопасен. И в этом случае вполне можно избежать:

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

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Shell
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]
    Kernel[] Kernels;
}
4 голосов
/ 24 февраля 2012

Вы можете сделать это в небезопасном коде с ключевым словом fixed:

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

EDIT

Это использование fixed было добавлено в C # 2.0, согласно документации для «буферов фиксированного размера».

РЕДАКТИРОВАТЬ 2

И, к сожалению, вы можете создавать только фиксированные буферы примитивного типа; как говорится в документации, «единственным ограничением является то, что тип массива должен быть bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float или double»

...