2

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

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

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

我是否被迫采取这两种次优的行动方案之一?还是有一些我还没有想到的解决方案?

4

1 回答 1

1

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

默认情况下,所有引用的程序集都属于全局别名,这就是为什么在生成的代码中您会看到类似global::System.String. 我不能确定如何在 ILMerge 中使用外部别名,但您可以使用它来消除引用程序集的歧义。无论哪种方式,您都可以将您的“内部”Castle.Core.dll 指定为类似于“城堡”的别名,并从中删除全局别名。不利的一面是,您必须修改代码才能利用这一点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.IInterceptor集中传入类型将不起作用。Castle.Core.Interceptor.IInterceptor

于 2013-05-22T01:02:36.517 回答