关于c#:合并DLL和更改管理名称空间

Merging DLL's and changing managing namespaces

我想创建一个与第三方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/

Bingo! So by using ILMerge, it becomes
possible to merge the third-party
libraries DLLs in with the Providers
own DLL, meaning we will only have one
DLL to deploy. But that’s not all, we
can actually go one step further, and
tell ILMerge to internalize all
dependencies. What this does it
converts all the third party classes
to be declared as internal, meaning
they can only be used from within the
final DLL. Woo hoo! problem solved =)

鉴于此问题,我的dll的使用者也可能拥有NLog了...当我引用的NLog转变为全部内部时!这正是我想要的。

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


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

否则,您可能处在DLL地狱中,这会驱使您的消费者离开。

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


我必须同意@Hans Passant(这是有关经常讨论的DLL地狱的一些信息),但是由于您已经问了这个问题,所以我会尽力回答。

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

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

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

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