Блок приложения Unity: при разрешении возникло исключение: BadImageFormatException

Я использую Unity 2.1 в своем приложении и получаю сообщение об ошибке в заголовке для одного сценария разрешения. Я понятия не имею, где искать.

  • Я использую Windows 7 64bit
  • 32-разрядные приложения включены
  • Пробовал сборку для "любого процессора" и "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.DynamicMethodBuildPlanCreatePlanCreatorPolicy. (контекст IBuilderContext, NamedTypeBuildKey buildKey) в Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (контекст IBuilderContext) в Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (контекст IBuilderContext) в Microsoft.Practices.Unity.UnityContainer.DoBuildUp (тип t, Object существующий, строковое имя, IEnumerable`1 resolverOverrides)


person ReFocus    schedule 23.03.2012    source источник
comment
пожалуйста, опубликуйте завершенный StackTrace BadImageFormatException   -  person Jehof    schedule 23.03.2012
comment
@Jehof: добавлена ​​трассировка стека   -  person ReFocus    schedule 23.03.2012


Ответы (1)


У вас есть версия Unity x32. Сборки вашего проекта создаются как x64, но в качестве ссылок используются 32-разрядные сборки Unity. К сожалению, компиляция пройдет нормально. Однако во время выполнения вы получите неприятный сюрприз. Итог: скомпилируйте с целевой платформой x86.

64-разрядные сборки, вызывающие 32-разрядные сборки, являются одной из наиболее распространенных причин ошибки BadImageFormatException.

Примечания MSDN:

Библиотека DLL или исполняемый файл загружается как 64-разрядная сборка, но содержит 32-разрядные функции или ресурсы. Например, он использует COM-взаимодействие или вызывает методы в 32-разрядной библиотеке динамической компоновки.

Чтобы устранить это исключение, задайте для свойства целевой платформы проекта значение x86 (вместо x64 или AnyCPU) и выполните повторную компиляцию.

Дополнительная информация здесь.

person code4life    schedule 23.03.2012
comment
Unity поставляется с модулем, который я использую, поэтому я не могу его перестроить. Однако у меня включены 32-битные приложения, так что это не должно быть проблемой? - person ReFocus; 23.03.2012
comment
Тогда вы должны строго ориентироваться на x86. Вы не сможете компилировать сборки x64 при использовании этой версии Unity. - person code4life; 23.03.2012
comment
Но это работало раньше. Я должен упомянуть, может быть, что сегодня утром я начал обобщать OrderManager классы, из-за чего возникла ошибка... - person ReFocus; 23.03.2012
comment
Попробуйте установить цель x86 и посмотрите, сработает ли это. Я полагаю, что вы не столкнетесь с BadImageFormatException до времени выполнения, то есть когда первая ссылка на Unity фактически заставит разрешить сборку. Этого могло не случиться до сих пор. - person code4life; 23.03.2012
comment
Ссылка правильная, но во время выполнения не загружается. Причина в том, что 64-битная сборка ожидает 64-битную ссылочную сборку, а не 32-битную ссылочную сборку. Это не решается во время проектирования и компиляции — проблема возникает только во время выполнения, на этапе разрешения сборки. Я прекращу добавлять какие-либо дополнительные комментарии на этом этапе, пока вы не попробуете то, что предлагает MSDN. - person code4life; 23.03.2012