Unity应用程序块:解析时发生异常:BadImageFormatException
我在应用程序中使用Unity 2.1,在一个解决方案的标题中收到错误。我不知道去哪里找Unity应用程序块:解析时发生异常:BadImageFormatException,exception,unity-container,badimageformatexception,Exception,Unity Container,Badimageformatexception,我在应用程序中使用Unity 2.1,在一个解决方案的标题中收到错误。我不知道去哪里找 我正在运行64位Windows 7 32位应用程序已启用 尝试针对“任何CPU”和“x64”构建 问题似乎与64位体系结构无关。任何帮助都将不胜感激 情景 //works:class=“ProductManager Container.Resolve() //工作:class=“OrderManager” Container.Resolve您拥有的Unity版本是x32。您的项目程序集正在构建为x64,但
- 我正在运行64位Windows 7
- 32位应用程序已启用
- 尝试针对“任何CPU”和“x64”构建
//works:class=“ProductManager
Container.Resolve()
//工作:class=“OrderManager”
Container.Resolve您拥有的Unity
版本是x32
。您的项目程序集正在构建为x64
,但有32位Unity程序集作为引用。不幸的是,编译会顺利进行。不过,在运行时您会感到非常意外。底线:使用平台目标x86
进行编译
64位程序集调用32位程序集是导致BadImageFormatException
的最常见原因之一
MSDN注释:
DLL或可执行文件作为64位程序集加载,但它包含
32位功能或资源。例如,它依赖于COM互操作或
调用32位动态链接库中的方法
要解决此异常,请设置项目的平台目标属性
到x86(而不是x64或任何CPU)并重新编译
更多信息。请发布已完成的堆栈跟踪BadImageFormatException@Jehof:Added stacktraceUnity随我正在使用的模块一起提供,因此我无法重建它。但是我已启用32位应用程序,因此这不应该是一个问题?那么您应该严格针对x86
。您将无法编译x64汇编在使用该版本的Unity时。但这以前确实有效。我需要提到的是,可能是我今天早上开始泛化导致错误发生的OrderManager
类…尝试设置x86
目标,看看是否有效。我相信在运行时之前不会遇到BadImageFormatException
,这意味着当对Unity的第一次引用实际强制程序集解析时。这可能直到现在才发生。引用是正确的,但在运行时不会加载。原因是,64位程序集需要64位引用的程序集,而不是32位引用的程序集。这在设计和编译期间不会得到解析-只会成为在运行时,在程序集解析阶段,我将停止添加任何进一步的注释,直到您尝试MSDN的建议。
//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>();
<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
{
}