5

我有这样的场景:

我正在使用拦截器来捕获对主项目引用的程序集内部类(我们称之为功能)的调用。程序集功能由 NuGet 安装(它不是公开的,而是我们内部的)并引用了另一个程序集(我们称之为核心)。主要项目也引用了程序集核心。核心包含用作被拦截方法之一的参数类型的类定义。

只要主项目和功能引用相同版本的核心库,这一切都可以正常工作。当这个版本不同并且被拦截的方法使用 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。

4

1 回答 1

7

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

解决方案是确保在这两种情况下都使用签名程序集,或者强制 DynamicProxy 仅生成未签名程序集。

于 2012-11-29T01:01:37.453 回答