2010-07-02 29 views
0

我剛剛將項目從VS2008/.NET 3.5/PostSharp 1.5升級到VS2010/.NET4.0/PostSharp 2.0。PostSharp導致BadImageException應用到通用方法 - 運行時出現錯誤peverify.exe

現在,運行單元測試系統時,我得到的形式hundereds例外:

System.BadImageFormatException:試圖加載程序格式不正確。 (從HRESULT異常:0x8007000B)在COMPANY.Data.NHibernate.BaseRepository.c__Binding`1.Invoke 在COMPANY(對象&例如,參數的參數,對象aspectArgs) 在PostSharp.Aspects.Internals.MethodInterceptionArgsImpl.Proceed() 。 C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ Aop \ TransactionAspectAttribute.cs中的Aop.TransactionAspectAttribute.OnInvoke(MethodInterceptionArgs上下文):第68行 位於COMPANY.Data.NHibernate.BaseRepository.Save [T](T scoreBigModel )位於C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ DataAccess \ NHibernate \ BaseRepository.cs中:第102行 位於COMPANY.UnitTests.DataAccess.NHibernate.when_saving_a_canonical_term。 < .ctor> b__5()in C:\ COMPANY \ Code \ COMPANY-NET4.0 \ UnitTests \ DataAccess \ NHibernate \ CanonicalTermRepositorySpecs.cs:line 29 at Machine.Specifications.Utility.RandomExtensionMethods.InvokeIfNotNull(因爲) at Machine.Specifications.Model.Context.EstablishContext()

當我在程序集上運行peverify.exe時,在下面的表單中看到數百個錯誤。總是似乎是通用方法的問題:

[IL]:錯誤:[C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ bin \ Debug \ COMPANY.Core.dll:COMPANY.Data.NHibernate .ActivationRepository + c__Binding :: Invoke] [offset 0x0000008D] [found ref'PostSharp.Aspects.Internals.MethodBinding'] [expected ref'PostSharp.Aspects.Internals.MethodBinding`1 [COMPANY.Models.Activation]']意外的類型on堆棧。

[IL]:錯誤:[C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ bin \ Debug \ COMPANY.Core.dll:COMPANY.Data.NHibernate.ActivationRepository + c__Binding :: Invoke] [[偏移0x00000056] [找到ref'PostSharp.Aspects.Internals.MethodBinding`1 [COMPANY.Models.Activation]'] [expected ref'PostSharp.Aspects.Internals.MethodBinding']堆棧上的意外類型。

我正在運行PostSharp 2.0 RC的最新版本。

+0

你提供該產品的beta測試者,你需要發送反饋給供應商。系統需求需要VS2010 RC,不要試圖使VS2010 RTM可以工作。 – 2010-07-02 17:59:06

+0

支持VS2010 RTM,RC不支持。這是該網站的一個錯誤。我會糾正它。 – 2010-07-02 20:19:27

回答

0

「System.BadImageFormatException」通常表示64位/ 32位問題。

如果您編譯「Any CPU」的代碼並在64位處理器上運行它,它將被編譯爲64位JIT。如果它隨後調用32位的任何代碼(例如,在非託管dll中),那麼當它試圖從64位代碼跳轉到32位代碼時,您會得到此異常。

如果您正在64位操作系統上運行,那麼升級中的某些內容可能會導致您的程序在其中混合使用32位和64位代碼。如果你在32位操作系統上運行,那麼不會成爲問題,但在這種情況下,它可能表示損壞的二進制文件。

如果是32/64,那麼你就可以做到以下幾點: - 確保所有您使用的是相同的位岬爲您的應用程序,或 的dll文件 - 如果你不能代替某些32位dll與64位版本,請嘗試將您的應用程序編譯爲「x86」而不是「任何CPU」。這將迫使它被編譯爲32位代碼,即使在64位PC上,這也意味着它必須作爲32位應用程序在WoW64下運行,但它將與其32位dll兼容。

+0

我試着將它編譯爲x86,並且運行時和peverify.exe錯誤沒有改變。 看起來PostSharp正在重寫程序集有一個特定的錯誤 - 推送和彈出一個對象,但一次引用它是通用的,而在另一次引用它是非泛型的。 – Mike 2010-07-02 17:46:10

+0

@Mike:我恐怕沒有太多的幫助。我可能會嘗試回滾到之前的PostSharp,以查看是否可以確定工具鏈的哪一部分對此問題負責。 (我不會首先懷疑VS/.net) – 2010-07-02 17:50:52

相關問題