城堡DynamicProxy拦截器具有不同的组件的问题(Castle DynamicProxy In

2019-08-03 05:05发布

我有这样一个场景:

我使用拦截器捕捉到一类是内部组件的调用(我们称之为功能)由主体工程引用。 装配特征是通过安装的NuGet(它不公开,但我们内部的一个),并具有一定的参考到另一个组件(我们称之为核心)。 主要项目是引用组件的堆芯为好。 芯包含用来作为参数类型的所拦截的方法之一的类定义。

这一切,只要能正常工作的主要项目和特色是引用核心库的版本相同。 当这个版本是不同的,并且截获方法从核心使用类型为方法参数出现问题。

在这种情况下,抛出一个异常,指出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。 城堡DynamicProxy无法找到核心与0.2.2.30版本,因为这个确切的组件未部署到bin文件夹这是正确的。

请注意,不同版本的核心是在我们的情景完全正常的情况。 功能组件期待的版本高于规定 - 不准确的版本。

我不知道是否DynamicProxy应该在它的装配期望刚性不足是我必须接受这个限制。 我已经写了简单的代理类来解决这个问题,所以它不会阻止我了,但它的块我们从我们的解决方案使用DynamicProxy。

Answer 1:

该问题是由DP是针对有符号的组件产生,然后被正在使用的组件的一个无符号版本的事实引起的。

解决方法是,以确保您在这两种情况下使用签名的程序集,或者强迫DynamicProxy只生成未签名程序集。



文章来源: Castle DynamicProxy Interceptor having problems with different assemblies