C# .NET-具有相同命名空间的多个库-引用

C# .NET-具有相同命名空间的多个库-引用,c#,namespaces,C#,Namespaces,今天我面临一个奇怪的挑战 这个挑战涉及两个.NET库,我需要从我的应用程序中引用它们。这两个名称空间我都无法控制,并且在它们内部具有相同的名称空间 所以 我有foo.dll,它包含一个小部件类,该类位于Blue.Red.Orange命名空间上 我有一个bar.dll,它还包含一个Widget类,该类也位于Blue.Red.Orange命名空间上 最后,我的应用程序需要同时引用foo.dll和bar.dll。这是必需的,因为在我的应用程序中,我需要使用foo中的Widget类以及bar中的Widg

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

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

所以

我有
foo.dll
,它包含一个
小部件
类,该类位于
Blue.Red.Orange
命名空间上

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

最后,我的应用程序需要同时引用
foo.dll
bar.dll
。这是必需的,因为在我的应用程序中,我需要使用
foo
中的
Widget
类以及
bar中的
Widget

所以,问题是我如何管理这些引用,以便确定我使用的是正确的
小部件

如前所述,我对
foo
bar
库没有控制权,它们是真实的,不能更改。但是,我可以完全控制我的应用程序。

您需要使用C#2中引入的-


Anson Horton有一个你可能会觉得有用的方法。

如果你能做到这一点,而不使用反射,我会感到惊讶


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

哇,这很棘手。我会创建两个包装DLL:

  • MyBarWrapper.dll(它引用了bar.dll)
  • MyFooWrapper.dll(它引用了foo.dll)

  • 并且支持不同的名称空间。

    我认为您必须使用
    extern alias


    这是一个演练

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

    觉得自己很惊讶:)对不起。我不认识外人的别名。我认为这是一种更好的方法。可能值得注意的是,每个程序集都有默认的外部别名
    global
    ,别名似乎是同一程序集的不同版本的一个选项,而不是用于不同的程序集目的,这只是一种错误的体系结构。@Augusto:它适用于同一程序集的不同版本,或用于包含相同命名空间限定类型名称的不同程序集。这不仅仅是为了一种或另一种情况。你是说我的解决方案行不通吗?如果是这样的话,你有什么可以支持这一说法吗?@Jon Skeet:你的解决方案不是问题,但它是解决架构问题的一个聪明的“黑客”。他不应该在不同程序集中的相同名称空间中有两个同名的不同类。对于同一概念的两个不同实现,他应该使用一个接口。由于他无法控制它,我认为您的解决方案是好的。@Augusto:不要忘记这些库可能是第三方库,没有任何第三方做错任何事情(尽管这里的常见情况可能是不适当地使用“全局”名称空间)。