合并DLL并更改管理命名空间

时间:2011-05-02 02:03:43

标签: c# .net dll ilmerge

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

为了扩充,我们可以说第三方dll是nLog。如何处理合并后的dll的消费者已将NLog作为项目参考的情况?

理想情况下,我希望能够做的是将项目中的NLog名称空间更改为“XyzNLog”,这意味着用户不需要进行任何别名......任何想法我怎么做?

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

更新 - 解决方案

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

  

宾果!因此,通过使用ILMerge,它就变成了   有可能合并第三方   库提供者的DLL库   自己的DLL,意思是我们只有一个   要部署的DLL。 但这不是全部,我们   实际上可以更进一步,并且   告诉ILMerge 内化所有   依赖即可。这是做什么的   转换所有第三方类   被宣布为内部的,意思是   它们只能在内部使用   最终的DLL。呜啊!问题解决=)

鉴于这个问题,我的dll的消费者也可以让NLog消失......因为我引用的NLog转移到全部内部!这正是我想要的。

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

2 个答案:

答案 0 :(得分:1)

我同意汉斯的观点,我强烈建议单独注册这些DLL。

否则,你可能会陷入DLL地狱,这将驱使你的消费者离开。

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

答案 1 :(得分:0)

我必须同意@Hans Passant(和here's some info关于经常讨论的DLL地狱),但既然你已经提出了这个问题,我会尽力回答。

您可以将第三方DLL捆绑为资源。有关详细信息,请see this question

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

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

编辑:另一种方法是尝试将ILMerge与/ internalize标志as described here一起使用。您可能无法完全解决问题,但请查看at this article以查看是否可以避免作者描述的陷阱。剧透警报:这并不是所有的桃子都在这个,但它可能会工作,有足够的额外努力。