应用于泛型方法时,PostSharp会导致BadImageException - 运行peverify.exe时出错

时间:2010-07-02 17:26:40

标签: c# postsharp

我刚刚将一个项目从VS2008 / .NET 3.5 / PostSharp 1.5升级到VS2010 / .NET4.0 / PostSharp 2.0。

现在,当运行系统的单元测试时,我得到了以下形式的例外:

System.BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)    at COMPANY.Data.NHibernate.BaseRepository.c__Binding`1.Invoke(Object& instance,Arguments arguments,Object aspectArgs)    在PostSharp.Aspects.Internals.MethodInterceptionArgsImpl.Proceed()    位于C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ Aop \ TransactionAspectAttribute.cs中的COMPANY.Aop.TransactionAspectAttribute.OnInvoke(MethodInterceptionArgs context):第68行    位于C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ DataAccess \ NHibernate \ BaseRepository.cs中的COMPANY.Data.NHibernate.BaseRepository.Save [T](T scoreBigModel):第102行    at COMPANY.UnitTests.DataAccess.NHibernate.when_saving_a_canonical_term。< .ctor> b__5()在C:\ COMPANY \ Code \ COMPANY-NET4.0 \ UnitTests \ DataAccess \ NHibernate \ CanonicalTermRepositorySpecs.cs:第29行    在Machine.Specifications.Utility.RandomExtensionMethods.InvokeIfNotNull(因为因为)    在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]']堆栈上的意外类型。

[IL]:错误:[C:\ COMPANY \ Code \ COMPANY-NET4.0 \ Core \ bin \ Debug \ COMPANY.Core.dll:COMPANY.Data.NHibernate.ActivationRepository + c__Binding :: Invoke] [offset 0x00000056] [found ref'PostSharp.Aspects.Internals.MethodBinding`1 [COMPANY.Models.Activation]'] [expected ref'PostSharp.Aspects.Internals.MethodBinding']堆栈上的意外类型。

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

2 个答案:

答案 0 :(得分:1)

这个问题正在解决:{{3p>

答案 1 :(得分:0)

“System.BadImageFormatException”通常表示64位/ 32位问题。

如果编译“Any CPU”的代码并在64位处理器上运行它,它将被JIT编译为64位。如果它然后调用任何32位的代码(例如在非托管的dll中),当它尝试从64位跳转到32位代码时,你会得到这个异常。

如果您在64位操作系统上运行,那么升级中的某些内容可能会导致程序中混合使用32位和64位代码。如果您在32位操作系统上运行,那么就不会出现问题,但在这种情况下,它可能表示存在损坏的二进制文件。

如果是32/64,那么您可以执行以下操作: - 确保您使用的所有dll与您的应用程序的位置相同,或者 - 如果您无法用64位版本替换某些32位dll,请尝试将您的应用程序编译为“x86”而不是“任何CPU”。这将迫使它甚至在64位PC上编译为32位代码,这意味着它必须作为32位应用程序在WoW64下运行,但它将与其32位dll兼容。