2012-11-25 7 views
5

私はこのようなシナリオを持っていた:城DynamicProxyインターセプタが異なるアセンブリに問題

私はアセンブリ内にあるクラスへの呼び出しをキャッチするためにインターセプタを使用しています(のはフィーチャーそれを呼びましょう)メインプロジェクトによって参照されます。アセンブリフィーチャはNuGetによってインストールされます(これはpublicではなく、内部のものです)、別のアセンブリへの参照を持ちます(コアと呼ぶ)。主なプロジェクトはアセンブリコアを参照しています。コアには、インターセプトされたメソッドの1つの引数型として使用されるクラス定義が含まれます。

メインプロジェクトと機能が同じバージョンのコアライブラリを参照している限り、すべて正常に動作します。このバージョンが異なり、インターセプトされたメソッドがメソッド引数としてCoreの型を使用すると、問題が発生します。この状況で

は、例外が状態 A strongly-named assembly is required.というスローされます。

はコア0.2.2.30のバージョンはアセンブリ機能が期待されているバージョンである
[FileLoadException: Could not load file or assembly 'Core, Version=0.2.2.30, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044)] 
Castle.Proxies.Invocations.IBasketService_Update.InvokeMethodOnTarget() +0 
Castle.DynamicProxy.AbstractInvocation.Proceed() +116 
Project.Basket.BasketServiceUpdatedInterceptor.Intercept(IInvocation invocation) in c:\(...)\Basket\BasketServiceUpdatedInterceptor.cs:20 
Castle.DynamicProxy.AbstractInvocation.Proceed() +604 
Castle.Proxies.IBasketServiceProxy.Update(ProductId productId, UInt16 quantity) +210 (...) 

、メインプロジェクトは、例えば、バージョン0.2.2.31のために使用されます。 Castle DynamicProxyはバージョン0.2.2.30のCoreを見つけることができません。この正確なアセンブリはbinフォルダにはデプロイされていないため、そうです。

異なるバージョンのコアは、このシナリオでは完全に正常な状況です。フィーチャアセンブリでは、指定したバージョンよりも高いバージョンが必要です。正確なバージョンではありません。

DynamicProxyのアセンブリの期待値がそれほど厳しくないかどうかはわかりませんが、この制限を受け入れる必要があります。私はこの問題を克服するためにシンプルなプロキシクラスを作成しましたので、私をもうブロックしないで、私たちのソリューションでDynamicProxyを使用できなくなってしまいました。

答えて

7

この問題は、DPが署名付きアセンブリに対して生成され、次に署名されていないバージョンのアセンブリが使用されているために発生します。

解決方法は、どちらの場合でも符号付きアセンブリを使用するか、またはDynamicProxyに符号なしアセンブリのみを強制的に生成させることです。

+0

Castle.Windsor(DynamicProxyを使用する)で使用する場合とまったく同じ問題があります。したがって、署名されていないアセンブリを生成する機会はありません。今何をすべきか手がかり? –

+6

それを見つけました:) windsorContainer.Kernel.ProxyFactory = new DefaultProxyFactory(disableSignedModule:true); –

関連する問題