Если у вас есть 2 типа с одинаковым именем (обратите внимание, что имя включает пространство имен), но в разных DLL, и вы заинтересованы в использовании обоих из них, то вы можете сделать это.
Короткий ответ
У вас есть тип Acme.Foo
в 2 разных DLL, и вы хотите их использовать. Задайте для псевдонима ссылку в окне свойств ссылки (Окно просмотра | Свойства), затем используйте его следующим образом:
extern alias TheAliasYouGaveTheReference
TheAliasYouGaveTheReference::Acme.Foo f = new
TheAliasYouGaveTheReference::Acme.Foo();
Пространство имен по умолчанию - global
для любой программы на C # , но обратите внимание, что выше мы используем созданный псевдоним вместо global
.
Наилучший подход заключается в том, чтобы НЕ вообще попасть в подобную ситуацию, если обе сборки являются вашими собственными, то не создавайте 2 типа с одинаковыми именами в одном и том же пространстве имен. Но иногда мы не контролируем исходный код, поэтому для этого времени можно использовать вышеуказанное решение.
Длинный ответ
Я копирую большую часть статьи из здесь , поэтому она записывается здесь в случае, если статья больше не доступна.
Как вы попали в такую ситуацию?
Во-первых, вот как вы можете повторить сценарий, чтобы было действительно ясно, о чем мы говорим:
- Создание библиотеки классов C # с именем FooVersion1
Заменить код шаблона в Class1.cs следующим:
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}
Щелкните правой кнопкой мыши решение в обозревателе решений и выберите Добавить | Новый проект
- Сохранить текущий проект (только в экспрессе)
- Выберите библиотеку классов в диалоговом окне нового проекта, измените имя проекта на FooVersion2 и нажмите OK
Заменить код в Class1.cs следующим:
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
public void Goo()
{
Console.WriteLine("Goo");
}
}
}
Использование типа в приложении
Хорошо, теперь у нас есть 2 разные сборки, содержащие Acme.Foo
. Теперь давайте создадим консольное приложение и попробуем использовать каждое из них.
- Щелкните правой кнопкой мыши решение в обозревателе решений и выберите Добавить | Новый проект
- Выберите консольное приложение и назовите его Consumer
- Щелкните правой кнопкой мыши на Consumer и выберите «Установить как стартовый проект».
- Щелкните правой кнопкой мыши узел ссылок в проекте Consumer и выберите «Добавить ссылку»
- Нажмите на вкладку проектов и выберите несколько объектов FooVersion1 и FooVersion2.
Нажмите ОК
Добавьте следующую строку в Main в типе программы проекта Consumer:
Acme.Foo f = new Acme.Foo();
Постройте решение с помощью Ctrl + Shift + B (или F6)
Обратите внимание, что вы получаете две ошибки сборки [как показано ниже]:
Исправление
Вот как мы можем это исправить:
- Откройте обозреватель решений и выберите FooVersion1 в папке «Ссылки» проекта «Потребитель»
- Нажмите F4 (или выберите View | Properties Window)
- Измените свойство псевдонимов на FooVersion1
- Постройте решение
- Теперь все будет работать правильно, потому что Acme.Foo однозначно относится к FooVersion2
Добавьте следующую директиву в начало Program.cs в проекте Consumer:
extern alias FooVersion1;
Измените использование Acme.Foo на:
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
f.Bar();
Обратите внимание, что когда вы набираете «f», список завершения содержит только те методы в FooVersion1 из Acme.Foo (в частности, он не включает Goo)
- Постройте решение, и все будет работать правильно
Наконец добавьте следующий код в f.Bar () в Program.cs проекта Consumer:
Acme.Foo f2 = new Acme.Foo();
f2.Goo();
Обратите внимание, что список завершения f2 содержит Goo.
- Выполните сборку снова, используя Ctrl + Shift + B, и обратите внимание, что все еще нет ошибок сборки