【问题标题】:Castle DynamicProxy Interceptor having problems with different assembliesCastle DynamicProxy 拦截器在不同程序集上存在问题
【发布时间】:2015-08-14 14:46:43
【问题描述】:

我有这样一个场景:

我正在使用拦截器来捕获对主项目引用的程序集内部类(我们称之为功能)的调用。程序集功能由 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 版本的核心,这是正确的,因为这个确切的程序集没有部署到 bin 文件夹。

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

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

【问题讨论】:

    标签: c# castle-dynamicproxy


    【解决方案1】:

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

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

    【讨论】:

    • 我们遇到了完全相同的问题 - 将它与 Castle.Windsor(使用 DynamicProxy)一起使用时。因此,我们没有机会对其进行检测以生成未签名的程序集。现在有什么线索吗?
    • 找到了 :) windsorContainer.Kernel.ProxyFactory = new DefaultProxyFactory(disableSignedModule:true);
    猜你喜欢
    • 2012-03-31
    • 2011-04-26
    • 2023-03-03
    • 1970-01-01
    • 2012-01-19
    • 2018-10-06
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多