2012-11-25 56 views
5

我有這樣一個場景:不同組件城堡DynamicProxy攔截器有問題

我使用攔截器捕捉到一類是內部組件的調用(我們稱之爲功能)由主體工程引用。 Assembly功能由NuGet安裝(它不是公開的,但是是內部的),並且引用了另一個程序集(我們稱之爲Core)。主項目也引用組裝核心。 Core包含用作被攔截方法之一的參數類型的類定義。

只要主項目和功能引用相同版本的Core庫,它就可以正常工作。當這個版本不同並且攔截方法使用來自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 (...) 

該處核心0.2.2.30版本是裝配特徵期待一個版本,主要項目使用,例如版本0.2.2.31。 Castle DynamicProxy無法找到版本爲0.2.2.30的Core,這是正確的,因爲這個確切的程序集沒有部署到bin文件夾。

請注意,在我們的場景中,不同版本的Core是完全正常的情況。特徵組件期望版本高於指定版本 - 不是精確版本。

我不確定DynamicProxy是否應該在組裝期望中不太僵化,我不得不接受這個限制。我寫了簡單的代理類來克服這個問題,所以它不會阻止我,但它阻止我們在我們的解決方案中使用DynamicProxy。

回答

7

該問題是由於DP是針對已簽名的程序集生成的,然後使用了該程序集的未簽名版本而造成的。

解決方法是確保您在兩種情況下都使用簽名的程序集,或強制DynamicProxy僅生成未簽名的程序集。

+0

當使用Castle.Windsor(使用DynamicProxy)時,我們有完全相同的問題。所以,我們沒有機會用它來生成未簽名的程序集。任何線索現在要做什麼? –

+6

找到它:) windsorContainer.Kernel.ProxyFactory = new DefaultProxyFactory(disableSignedModule:true); –