2012-11-25 53 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); –