5

次のようなシナリオがあります。

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

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

この状況では、次のような例外がスローされますA strongly-named assembly is required.

[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 (...)

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

Core の異なるバージョンは、このシナリオでは完全に正常な状況であることに注意してください。フィーチャー アセンブリーは、指定されたバージョンよりも新しいバージョンを予期しています - 正確なバージョンではありません。

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

4

1 に答える 1

7

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

解決策は、両方のケースで署名付きアセンブリを使用することを確認するか、DynamicProxy に署名なしアセンブリのみを生成させることです。

于 2012-11-29T01:01:37.453 に答える