【问题标题】:.NET - Multiple libraries with the same namespace - referencing.NET - 具有相同命名空间的多个库 - 引用
【发布时间】:2011-06-13 04:23:30
【问题描述】:

今天我面临着一个奇怪的挑战......

这个挑战涉及我需要从我的应用程序中引用的两个 .NET 库。两者我都无法控制,并且在它们中具有相同的命名空间。

所以...

我有一个 foo.dll,其中包含一个位于 Blue.Red.Orange 命名空间上的 Widget 类。

我有bar.dll,它还包含一个Widget 类,该类也位于Blue.Red.Orange 命名空间中。

最后我的应用程序需要同时引用foo.dllbar.dll。这是需要的,因为在我的应用程序中我需要使用来自fooWidget 类以及来自barWidget

那么,问题是如何管理这些引用,以便确定我使用的是正确的Widget 类?

如前所述,我无法控制 foobar 库,它们就是它们的本来面目,无法更改。但是,我可以完全控制我的应用程序。

【问题讨论】:

    标签: c# namespaces


    【解决方案1】:

    您需要使用 extern alias - 在 C# 2 中引入。

    Anson Horton 有一个 walkthrough on his blog,您可能会觉得它很有用。

    【讨论】:

    • 可能值得注意的是,每个程序集的外部别名默认为global
    • 别名似乎是同一程序集的不同版本的选项,而不是用于不同的程序集目的,这只是错误的架构。
    • @Augusto:它既适用于同一程序集的不同版本,也适用于包含相同命名空间限定类型名称的不同程序集。这不仅仅是针对一种情况或另一种情况。您是否声称我的解决方案行不通?如果是这样,你有什么可以支持这种说法的吗?
    • @Jon Skeet:您的解决方案不是问题,但它是解决架构问题的巧妙“破解”。他不应该在不同程序集中的相同命名空间中有两个具有相同名称的不同类。对于同一概念的两种不同实现,他应该使用一个接口。由于他无法控制它,我想你的解决方案很好。
    • @Augusto:不要忘记库可能是第三方库,没有个别第三方做错任何事情(尽管这里的常见情况可能是不恰当地使用“全局”命名空间) .
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      您可以使用“别名”属性来解决冲突。选择库并打开属性窗口。这已经在SO post 中讨论过

      【讨论】:

        【解决方案4】:

        哇,这很棘手。我想,我会创建两个 wrapper-DLL:

        1. MyBarWrapper.dll(引用了 bar.dll)
        2. MyFooWrapper.dll(引用了 foo.dll)

        并在那里支持不同的命名空间。

        【讨论】:

        • 对不起。我不认识外部别名。我认为会是更好的方法。
        【解决方案5】:

        如果您可以在不使用反射的情况下做到这一点,我会感到惊讶。

        创建自己的 FooWrapper 和 BarWrapper dll 可能更容易,它们引用 foo 和 bar 并在不同的命名空间下再次公开它们的内容。

        【讨论】:

        • 觉得自己很惊讶 :)
        猜你喜欢
        • 2010-10-18
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 2020-07-13
        • 2020-08-02
        • 1970-01-01
        相关资源
        最近更新 更多