2

アプリケーションで Unity 2.1 を使用していますが、1 つの解決シナリオのタイトルにエラーが表示されます。どこを見たらいいのかわからない。

  • Windows 7 64ビットを実行しています
  • 32 ビット アプリケーションが有効になっている
  • 「Any 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 (Type delegateType) で 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(Type t、Object)既存、文字列名、IEnumerable`1 resolverOverrides)

4

1 に答える 1

2

お持ちのUnityバージョンはですx32。プロジェクトアセンブリはとしてビルドされてx64いますが、参照として32ビットのUnityアセンブリがあります。残念ながら、コンパイルはうまくいきます。ただし、実行時に厄介な驚きがあります。結論:プラットフォームターゲットを使用してコンパイルしますx86

32ビットアセンブリを呼び出す64ビットアセンブリは、の最も一般的な理由の1つですBadImageFormatException

MSDNノート:

DLLまたは実行可能ファイルは64ビットアセンブリとしてロードされますが、32ビットの機能またはリソースが含まれています。たとえば、COM相互運用機能に依存するか、32ビットダイナミックリンクライブラリのメソッドを呼び出します。

この例外に対処するには、プロジェクトのプラットフォームターゲットプロパティを(x64またはAnyCPUではなく)x86に設定し、再コンパイルします。

詳細はこちら

于 2012-03-23T13:56:46.177 に答える