私は C# からの DLL の呼び出しをいじっていて、独自の構造体を定義する必要があることに気づきました。多くの記事では、構造体の順次レイアウトを強制しています
[StructLayout(LayoutKind.Sequential)]
struct Foo ...
それで、私はスイートに従いました、そして私のプログラムはうまくいきました。今、私がラインを取り出したとき、それはまだ機能しています。なぜそれが必要なのですか?
私は C# からの DLL の呼び出しをいじっていて、独自の構造体を定義する必要があることに気づきました。多くの記事では、構造体の順次レイアウトを強制しています
[StructLayout(LayoutKind.Sequential)]
struct Foo ...
それで、私はスイートに従いました、そして私のプログラムはうまくいきました。今、私がラインを取り出したとき、それはまだ機能しています。なぜそれが必要なのですか?
マネージド構造体の内部レイアウトは文書化されておらず、発見できません。メンバーの注文や梱包などの実装の詳細は、意図的に隠されています。[StructLayout] 属性を使用して、P/Invoke マーシャラーに特定のレイアウトとパッキングを強制します。
デフォルトがたまたまコードを動作させるために必要なものと一致するということは、単なる偶然です。珍しいものではありませんが。Type.StructLayoutAttribute プロパティに注意してください。
興味深い点。明示的な LayoutKind.Sequential を挿入するまで失敗するコードがあったことは確かですが、1.1 でも Sequential が構造のデフォルトであることを確認しました。
VB Reference for Structureは、 [Remarks] > [Behavior] > [Memory Consumption] で、メモリ レイアウトを確認するために StructLayout を指定する必要があることを暗示していますが、StructLayoutAttributeのドキュメントに は、Microsoft コンパイラの構造体のデフォルトは Sequential であると記載されていることに注意してください。
完全にはわかりませんが、バイナリのシリアル化に影響を与える可能性があります。名前付けや順序付けの情報を使用せずにフィールドを順番に吐き出す可能性があります (その結果、ファイルが小さくなります) が、それは完全な気まぐれです。