2008-12-26 73 views
5

我正在調用C#中的DLL,並且遇到了定義我自己的結構的需求。很多文章強制結構的順序佈局與什麼時候應該顯式指定一個StructLayout?

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

所以,我跟着套房,我的程序工作。現在,當我把線路拿出來的時候,它仍然有效。我爲什麼需要它?

回答

4

託管結構的內部佈局沒有文檔記錄且不可發現。有意隱藏諸如成員訂單和包裝等實施細節。使用[StructLayout]屬性,您可以強制P/Invoke編組器強制進行特定的佈局和打包。

默認只是恰好匹配你需要讓你的代碼工作的僅僅是一個意外。雖然並不罕見。請注意Type.StructLayoutAttribute屬性。

+0

感謝您的回答。我只看了一下struct的StructLayoutAttribute,在沒有該行的情況下。似乎都給了我連續的。這是默認的嗎? – biozinc 2008-12-26 16:57:56

0

我並不完全確定,但它可能會影響二進制序列化 - 它可能會將字段依次排列,而不命名或排序信息(導致文件較小),但這是完全的奇思妙想。

1

有趣的一點。我確信我的代碼失敗了,直到我放入了一個明確的LayoutKind.Sequential,但是我已經確認Sequential是結構的默認值,即使在1.1中也是如此。

注意VB Reference for Structure 意味着在備註>行爲>內存消耗,你需要指定StructLayout確認內存佈局,但StructLayoutAttribute 文檔指出順序是Microsoft的編譯器結構的默認。

相關問題