2014-11-01 18 views
1

將我的編譯器轉換爲使用Mono.Cecil而不是Reflection.Emit後,我從peverify中得到一個錯誤。peverify ClassLayout有標記爲AutoLayout的父TypeDef

Microsoft (R) .NET Framework PE Verifier. Version 4.0.30319.33440 
Copyright (c) Microsoft Corporation. All rights reserved. 

[MD]: Error: ClassLayout has parent TypeDef token=0x02000002 marked AutoLayout. [token:0x00000001] 
1 Error(s) Verifying test.exe 

我一直沒有找到任何有關這意味着什麼的信息。如果需要,我可以提供可執行文件。

+0

您是否看過使用兩種方法反彙編代碼的差異?有什麼不同?另外,你能否提供一個最小的示例代碼來生成導致上述錯誤的程序集? – svick 2014-11-01 22:27:31

回答

2

我只能描述驗證錯誤的含義,我不能從所提供的信息中推理出它造成的原因。這是您生成的程序集的元數據中的一個錯誤。特別是,ClassLayout表格,Ecma-335中的第II.22.8節。底層的錯誤代碼是VLDTR_E_CL_TDAUTO,0x80131229,「ClassLayout parent TypeDef標記爲AutoLayout」。

ClassLayout表包含用顯式佈局聲明的類型的記錄。在C#中,應用[StructLayout(LayoutKind.Explicit)]或[StructLayout(LayoutKind.Sequential)]屬性的類型。 LayoutKind.Auto是沒有屬性的類的默認值。驗證程序對ClassLayout表中的記錄進行雙重檢查,並將它們與TypeDef表中的相應記錄進行匹配。你違反了規則#3:

由家長索引應SequentialLayout或 ExplicitLayout(§II.23.1.15)類或值類型。 (也就是說,AutoLayout類型不應擁有 ClassLayout表中的任何行。)[錯誤]

+0

看起來問題是空的結構不能有自動佈局。是否有機會添加一些關於如何查看已列表的信息? – MI3Guy 2014-11-02 10:40:05