我有这样的场景:
我正在使用拦截器来捕获对主项目引用的程序集内部类(我们称之为功能)的调用。程序集功能由 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。