2012-02-24 20 views
1

私はこのようなデルファイに埋め込まレコードを持っている:C#で埋め込み構造体を宣言するにはどうすればよいでしょうか?

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

その後: Marshal.SizeOf(シェルこれで

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

TShell = packed record 
    Kernels: TKernels; 
end; 

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

をしかし、私は、C#を使用している場合)== 4

つまり、カーネルは単なるポインタですter。 私はDelphiとC#を相互運用したいので、そこにはメモリ構造が同じである必要があります。したがって、どのように構造体をC#で宣言する必要がありますか?Kernel KernelOneの20個の好きなものを書きます。カーネルKernelTwo ...

答えて

7

私は常に安全でない安全でないコードがありますから、可能であれば、安全ではありません。この場合は避けることが可能です:

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

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

Richard Schneiderのように、今日私は何か新しいことを学びましたが、私は不思議です:上記の宣言により、型のサイズは80になります(Marshal.SizeOfによって報告されます)しかし、 'Kernels'はデフォルト値がnullであり、任意の長さの' Kernel [] 'を割り当てることができます。したがって、管理型は明らかに通常の管理型です。長さが間違っていますか?)これはどこに書かれているのか分かりますか?http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.100).aspxに詳細はあまりありません。 – phoog

+0

余分な項目は切り捨てられます。欠落した項目は、デフォルト値を使用してマーシャリングされます。 –

4

あなたはfixedキーワードで危険なコードでこれを行うことができます:fixedのこの使用は、C#2.0で追加されました

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

EDIT

documentation for "fixed size buffers."

によると0

EDIT 2

そして、oopsではプリミティブ型の固定長バッファしか作成できません。 "唯一の制限は、配列の型がbool、byte、char、short、int、long、sbyte、ushort、uint、ulong、float、またはdoubleでなければならないということです。"

+0

ここで私はC#についてすべてを知っていると思っていました。よくやった! –

+0

@RichardSchneiderありがとう:-)興味のある場合に備えて、ドキュメントへのリンクを追加しました。ありがとうございます。 – phoog

+0

しかし、安全でないコードを除外します。アセンブリが/ unsafeを使用して構築できない場合は、安全なものはありますか? – chenwq

関連する問題