7

我想创建一个与第 3 方 dll合并的单个dll 。这意味着最终消费者只需处理 1 个 dll 而不是 2 个。

为了增强,可以说第 3 方 dll 是 nLog。我如何处理合并 dll 的使用者在他们的项目中已经将 NLog 作为参考的情况?

理想情况下,我想做的是将项目中的 NLog 命名空间更改为“XyzNLog”,这意味着用户不需要做任何别名......知道我该怎么做吗?

现在我知道我可以为我的 NLog 项目添加别名,以便我必须将其称为 XyzNLog,但我希望将其传递给合并的 dll 的消费者,这样就不会发生冲突。

更新 - 解决方案

http://blog.mattbrailsford.com/2010/12/10/avoiding-dependency-conflicts-using-ilmerge/

答对了!因此,通过使用 ILMerge,可以将第三方库 DLL 与 Providers 自己的 DLL 合并,这意味着我们只需部署一个 DLL。但这还不是全部,我们实际上可以更进一步,告诉 ILMerge内化所有依赖项。这样做会将所有第三方类转换为内部声明,这意味着它们只能在最终 DLL 中使用。呜呼!问题解决了=)

鉴于此,我的 dll 的使用者也可能让 NLog 消失的问题......因为我引用的 NLog 转变为全部内部!这正是我想要的。

有人对此有任何反馈或想法吗?

4

2 回答 2

1

我同意 Hans,我强烈建议发布时单独注册 DLL。

否则,您可能会陷入 DLL 地狱,这会将您的消费者赶走。

然后,您可以设计一些巧妙的部署方法来检测 DLL 是否已注册等。

于 2011-05-02T02:18:23.417 回答
0

我必须同意@Hans Passant(这里有一些关于经常讨论的 DLL 地狱的信息),但是既然你问了这个问题,我会试着回答它。

您可以将第三方 DLL 捆绑为资源。有关详细信息,请参阅此问题

至于您的其他问题,我只是在您自己的命名空间下从第三方 DLL 公开相关类,并且可能使用扩展方法来提供您想要的任何附加功能。

例如,您可以Log()在您的类中使用静态方法提供对 NLog 方法的访问,例如XyzNLog.Logger.Log(),在您的代码内部(静态构造函数或其他任何您喜欢的)处理初始化以及内部其他任何事情。由于您使用上述方法加载 NLog 程序集,因此您将是唯一可以直接访问嵌入式 NLog 程序集的人,而用户将无法访问它。现在,您并没有从 NLog 中自动公开所有类的好处,在这种情况下您仍然必须手动公开它们。

编辑: 另一种方法是尝试使用带有 /internalize 标志的 ILMerge,如此处所述。您可能无法完全解决问题,但请查看本文,看看您是否可以避免作者描述的陷阱。剧透警告:这也不是所有的桃子奶油,但它可能会起作用,只要付出足够的额外努力。

于 2011-05-02T02:22:04.427 回答