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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并DLL并更改管理命名空间相关的知识,希望对你有一定的参考价值。

我想创建一个与第三方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与Providers自己的DLL合并,这意味着我们将只部署一个DLL。但这不是全部,我们实际上可以更进一步,并告诉ILMerge内化所有依赖项。这样做会将所有第三方类转换为内部,这意味着它们只能在最终的DLL中使用。呜啊!问题解决=)

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

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

答案

我同意Hans的观点,我强烈建议单独注册DLL。

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

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

另一答案

我不得不同意@Hans Passant(以及关于经常讨论的DLL地狱的here's some info),但是既然你已经问了这个问题,我会尝试回答它。

您可以将第三方DLL捆绑为资源。请see this question了解详情。

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

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

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

以上是关于合并DLL并更改管理命名空间的主要内容,如果未能解决你的问题,请参考以下文章

将 DLL 导入 Unity - 找不到类型或命名空间

将 XElement 合并到 XDocument 并解析命名空间

从 C# 2.0 中的 dll 获取命名空间、类名

哪个 DLL 具有 Windows.Devices.Gelocation 命名空间?

xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”

Maya:将 HIK rig 顶部的 FBX 动画与命名空间合并