6

私は C# からの DLL の呼び出しをいじっていて、独自の構造体を定義する必要があることに気づきました。多くの記事では、構造体の順次レイアウトを強制しています

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

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

4

3 に答える 3

5

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

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

于 2008-12-26T16:41:45.893 に答える
1

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

VB Reference for Structureは、 [Remarks] > [Behavior] > [Memory Consumption] で、メモリ レイアウトを確認するために StructLayout を指定する必要があることを暗示していますが、StructLayoutAttributeのドキュメントに は、Microsoft コンパイラの構造体のデフォルトは Sequential であると記載されていることに注意してください。

于 2010-03-17T04:43:20.633 に答える
0

完全にはわかりませんが、バイナリのシリアル化に影響を与える可能性があります。名前付けや順序付けの情報を使用せずにフィールドを順番に吐き出す可能性があります (その結果、ファイルが小さくなります) が、それは完全な気まぐれです。

于 2008-12-27T12:02:58.360 に答える