2010-07-02 62 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

相关问题