我有一个 .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 的项目。
我是否被迫采取这两种次优的行动方案之一?还是有一些我还没有想到的解决方案?