StructLayoutを明示的に指定するタイミング

c# interop marshalling struct

私はC#からDLLを呼び出すのに戸惑い、私自身の構造体を定義する必要性に遭遇しました。 多くの記事は構造体のためのシーケンシャルレイアウトを強制します

[StructLayout(LayoutKind.Sequential)]
struct Foo ...

だから、私はスイートに従った、そして私のプログラムはうまくいった。 今、私はラインを取り出したとき、それはまだ機能します。 なぜ必要なのですか。

  6  0


ベストアンサー

マネージ構造体の内部レイアウトは文書化されておらず、発見できません。 メンバーの注文や梱包などの実装の詳細は意図的に隠されています。 [StructLayout]属性を使用すると、P / Invokeマーシャラに特定のレイアウトとパッキングを強制することができます。

コードが機能するために必要なものとデフォルト値が一致しているだけでは、単なる偶然です。 珍しいものではありませんが。 Type.StructLayoutAttributeプロパティに注意してください。

4


興味深い点です。 明示的なLayoutKind.Sequentialを入力するまでコードが失敗することは間違いありませんが、1.1でも、Sequentialが構造体のデフォルトであることを確認しました。

http://msdn.microsoft.com/ja-jp/library/k69kzbs1.aspx[構造体のリファレンス]を参照してください。メモリレイアウトを確認するには、StructLayoutを指定する必要があります。  http://msdn.microsoft.com/ja-jp/library/k69kzbs1.aspx[StructLayoutAttribute]の記述順次は、Microsoftコンパイラの構造体のデフォルトです。

1


完全にはわかりませんが、バイナリのシリアル化に影響を与える可能性があります。名前が付けられたり順序付けされたりしないでフィールドが適切に吐き出される可能性があります(ファイルが小さくなります)。

0


タイトルとURLをコピーしました