2

我在我的应用程序中使用 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" />

产品经理+界面

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

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

订单管理器 + 接口

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(Type delegateType) 在 Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.GetBuildMethod() 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy.CreatePlan (IBuilderContext context, NamedTypeBuildKey buildKey) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) 在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object现有,字符串名称,IEnumerable`1 resolverOverrides)

4

1 回答 1

2

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

64 位程序集调用 32 位程序集是BadImageFormatException.

MSDN 笔记:

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

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

更多信息在这里

于 2012-03-23T13:56:46.177 回答