【问题标题】:Unity Application Block: Exception occurred while resolving: BadImageFormatExceptionUnity 应用程序块:解决时发生异常:BadImageFormatException
【发布时间】:2012-04-08 01:37:10
【问题描述】:

我在我的应用程序中使用 Unity 2.1,并在一个解决方案的标题中收到错误。我不知道去哪里找。

  • 我正在运行 Windows 7 64 位
  • 32 位应用程序已启用
  • 尝试针对“任何 CPU”“x64”构建

问题似乎与 64 位架构无关。任何帮助将不胜感激!

场景

//works: class = "ProductManager<Product>
Container.Resolve<IProductManager<Product>>()

//works: class = "OrderManager"
Container.Resolve<IOrderManager()

//works: class="OrderManager" 
Container.Resolve<IOrderManager("OrderManager")

//DOESN'T WORK: EXCEPTION: BadImageFormatException
Container.Resolve<IOrderManager("OrderManager") 

//works: class="GenericOrderManager<Order>" (obviously)
var manager = new GenericOrderManager<Order>();

代码

Unity.config

<alias name="IProductManager" type="Assembly1.Namespace.IProductManager`1" />
<alias name="ProductManager" type="Assembly2.Namespace.ProductManager`1" />

<alias name="IOrderManager" type="Assembly1.Namespace.IOrderManager" />
<alias name="OrderManager" 
       type="Assembly1.Namespace.OrderManager" />
<alias name="OrderManager" 
       type="Assembly1.Namespace.OrderManager" 
       name="OrderManager" />
<alias name="GenericOrderManager" 
       type="Assembly2.Namespace.GenericOrderManager`1"
       name="GenericOrderManager" />

ProductManager + 界面

public interface IProductManager<TProduct> where TProduct : Product
{
}

public class ProductManager<TProduct> : IProductManager<TProduct> where TProduct : Product
{
}

OrderManager + 接口

public interface IOrderManager
{
}

public class OrderManager : IOrderManager
{
}

public class OrderManager<TOrder> : OrderManager where TOrder : Order
{
}

使用 StackTrace 更新:

在 System.Runtime.CompilerServices.RuntimeHelpers._CompileMethod(IRuntimeMethodInfo 方法)在 System.Reflection.Emit.DynamicMethod.CreateDelegate(类型 委托类型)在 Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.GetBuildMethod() 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy.CreatePlan(IBuilderContext 上下文,NamedTypeBuildKey buildKey)在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文)在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文)在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型 t, Object existing, String name, IEnumerable`1 resolverOverrides)

【问题讨论】:

  • 请发布 BadImageFormatException 的完整 StackTrace
  • @Jehof:添加了堆栈跟踪

标签: exception unity-container badimageformatexception


【解决方案1】:

您拥有的Unity 版本是x32。您的项目程序集正在构建为x64,但将 32 位 Unity 程序集作为参考。不幸的是,编译会很好。不过,在运行时你会得到一个令人讨厌的惊喜。底线:使用x86 的平台目标编译。

64 位程序集调用 32 位程序集是BadImageFormatException 的最常见原因之一。

MSDN 笔记:

DLL 或可执行文件作为 64 位程序集加载,但它包含 32 位功能或资源。例如,它依赖于 COM 互操作或 调用 32 位动态链接库中的方法。

要解决此异常,请设置项目的平台目标属性 到 x86(而不是 x64 或 AnyCPU)并重新编译。

更多信息here

【讨论】:

  • Unity 是随我使用的模块一起提供的,所以我无法重建它。但是我启用了 32 位应用程序,所以这应该不是问题吗?
  • 那么你应该严格定位x86。使用该版本的 Unity 时,您将无法编译 x64 程序集。
  • 但这之前确实有效。我需要提一下,也许我今天早上开始概括 OrderManager 类,这导致了错误发生......
  • 尝试设置x86 目标,看看是否可行。我相信直到运行时你才会遇到BadImageFormatException,这意味着当第一次引用 Unity 时实际上会强制执行程序集解析。这可能直到现在才发生。
  • 引用正确,但在运行时不会加载。原因是,64 位程序集需要 64 位引用程序集,而不是 32 位引用程序集。这在设计和编译期间不会得到解决 - 只会在运行时,在程序集解析阶段成为问题。在您尝试 MSDN 的建议之前,我将在此时停止添加任何进一步的 cmets。
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多