是否可以使用ILMerge内化Castle Project的DynamicProxy类?

时间:2013-02-28 16:12:40

标签: c# .net castle-dynamicproxy ilmerge

我有一个.NET库,内部依赖于Castle.Core.dll,因为我使用Castle's DynamicProxy(特别是“没有目标的接口代理”)来执行自定义处理的方法调用拦截。因为我的程序集名称很强,所以我想使用ILMerge将我的所有依赖项组合到一个程序集中进行部署,内化我的依赖项类型,以免不必要地向我的使用者公开它们。这对于NuGet情况尤其重要,如果我的程序集具有强名称,我必须将我的程序包依赖项设置为依赖项的特定版本,或者程序集名称解析中断,因为Castle.Core.dll也有很强的名字。请注意,将我的项目作为强名称程序集发布是我的用户重视的功能,因此删除强名称不是一种选择。

显然,DynamicProxy要求其某些类公开才能正常工作。没问题,我可以排除某些类型被ILMerge内化。但是,当我有一个用户引用我的库时,我的问题就出现了,但也引用了Castle.Core.dll。公共类型现在由两个程序集提供,对它们的引用不明确。

如果我没有使用ILMerge内化Castle.Core.dll,将它与我自己的程序集一起发送,这可能会导致我的版本与用户版本之间的版本冲突。如果我使用ILMerge内部化程序集,我不得不排除内部化DynamicProxy正常工作所需的类型。由于类型不明确,这种方法会破坏任何引用我的程序集和Castle.Core.dll的项目。

我是否被迫进入这两个次优行动中的一个?还是有一些我还没有想过的解决方案?

1 个答案:

答案 0 :(得分:0)

如果您有两个完全限定的同名类型,那么您将遇到歧义问题。这可以使用extern alias来解决。

默认情况下,所有引用的程序集都属于全局别名,这就是为什么在生成的代码中你会看到类似global::System.String的内容。我无法确定如何在ILMerge中使用extern别名,但您可以使用它来消除引用的程序集的歧义。无论哪种方式,您都可以将“内部”Castle.Core.dll指定为“ castle ”的别名,并从中删除全局别名。缺点是你必须修改你的代码才能利用这个castle::Castle.Core.Interceptor.IInterceptor

这是一个很好的资源,可以向您显示更多信息,包括图片:http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts-part-2-extern-alias/


请记住,辅助引用的Castle.Core.dll(由其他人使用你的程序集)可能包含相同的完全限定类型,但是在所有帐户中它们仍然是两个截然不同的类,即一种期望的方法通过从第二个程序集传递类型castle::Castle.Core.Interceptor.IInterceptorCastle.Core.Interceptor.IInterceptor类型无法正常工作。