Castle DynamicProxy Interceptor具有不同程序集的问题

时间:2012-11-25 16:30:49

标签: c# castle-dynamicproxy

我有这样的场景:

我使用拦截器来捕获对主程序引用的程序集内部的类(让它称之为功能)的调用。装配特征由NuGet安装(它不是公共的,而是我们的内部装配)并且引用了另一个装配(让我们称之为Core)。主项目也引用了汇编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 (...)

如果Core 0.2.2.30的版本是程序集Feature预期的版本,则主项目正在使用例如版本0.2.2.31。 Castle DynamicProxy无法找到版本为0.2.2.30的Core,而且这是正确的,因为这个精确的程序集未部署到bin文件夹。

请注意,在我们的场景中,不同版本的Core是完全正常的情况。功能组件期望版本高于指定版本 - 不是确切版本。

我不确定DynamicProxy是否应该不那么严格,它的装配期望是我必须接受这个限制。我已经编写了简单的代理类来克服这个问题,所以它不会阻止我,但它阻止我们在我们的解决方案中使用DynamicProxy。

1 个答案:

答案 0 :(得分:7)

问题是由于DP是针对已签名的程序集生成的,然后正在使用未签名的程序集版本。

解决方案是确保在两种情况下都使用带符号的程序集,或强制DynamicProxy仅生成无符号程序集。