合并DLL's和更改管理名称空间

本文关键字:管理 空间 DLL 合并 | 更新日期: 2023-09-27 17:54:22

我想创建一个单个 dll,该dll是与第三方dll合并的。这意味着终端用户将只需要处理1个dll而不是2个。

为了方便起见,我们假设第三方dll是nLog。我如何处理合并的dll的消费者已经在他们的项目中有NLog作为参考的情况?

理想情况下,我想能够做的是改变我的项目中的NLog命名空间为"XyzNLog",这意味着用户不需要做任何混叠…知道我该怎么做吗?

现在我知道我可以为我的NLog项目添加别名,这样我就必须把它称为XyzNLog,但我希望同样的延续到合并的dll的消费者,这样就不会有冲突。

UPDATE - Solution

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

宾果!通过使用ILMerge,它就变成了可以合并第三方库dll与提供程序自己的DLL,这意味着我们将只有一个要部署的DLL。但这不是全部,我们可以更进一步,然后呢告诉ILMerge 内化 all依赖关系。这有什么用转换所有第三方类被宣布为内部的,意思它们只能在内部使用最后的DLL。呜呼!问题解决了=)

考虑到这个问题,我的dll的消费者也可以有NLog消失…因为我参考的NLog都变成了内部日志!这正是我想要的。

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

合并DLL's和更改管理名称空间

我同意Hans的观点,我强烈建议单独发布并注册dll。

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

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

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

可以将第三方DLL捆绑为资源。

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

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

EDIT:另一种方法是尝试使用带有/internalize标志的ILMerge,如下所述。您可能无法完全解决这个问题,但请阅读本文,看看是否可以避免作者描述的陷阱。剧透警告:这款游戏也不全是桃子和奶油,但只要付出足够的努力,它可能会奏效。