Класс с одинаковым именем в двух сборках (намеренно) - PullRequest
33 голосов
/ 11 июня 2010

Я нахожусь в процессе переноса библиотеки, написанной на C ++ и имеющей оболочку C #.Оболочка C # (LibWrapper) имеет набор классов с пространствами имен, таких как:

namespace MyNamespace
   class MyClass
   class MyOtherClass

Моя новая библиотека, LibraryCS содержит те же пространства имен и имена классов, что и LibWrapper (по требованию пользователя)Итак, у меня также есть:

namespace MyNamespace
   class MyClass
   class MyOtherClass

Теперь, когда миграция завершена, я нахожусь в процессе создания теста, который сравнивает результаты использования обеих библиотек для проверки миграции.Однако, когда я пытаюсь сослаться на MyNamespace.MyClass, я получаю сообщение об ошибке компилятора (как и ожидалось!), В котором говорится, что «MyNamespace.MyClass определен как в LibWrapper, так и в LibraryCS».позвольте мне использовать два класса с одинаковым именем, но из разных сборок в одном и том же клиентском коде?

В качестве альтернативы, есть ли другой способ проверить это?

Переименование перенесенного пространства имен в другоевроде MyNamespace2, конечно, будет работать, но нас попросили не делать этого, чтобы облегчить перенос клиентского кода.

Ответы [ 4 ]

59 голосов
/ 11 июня 2010

Вы можете использовать внешний псевдоним для ссылки на типы с одинаковым полностью определенным именем из разных сборок.Выберите ссылку на LibraryCS и обновите псевдонимы на странице свойств с «global» до «LibraryCS», добавьте extern alias LibraryCS; в начало вашего исходного файла, а затем вы можете использовать LibraryCS::MyNamespace.MyClass для ссылки на класс в LibraryCS.Вы можете использовать MyNamespace.MyClass или global::MyNamespace.MyClass для ссылки на класс в LibWrapper, или вы также можете использовать псевдоним для этой ссылки.

4 голосов
/ 11 июня 2010

Чтобы загрузить оба этих класса в один исполняемый файл, вы можете загрузить их в отдельный домен приложения. Это позволит вам протестировать сборку, затем полностью выгрузить ее, загрузить вторую и протестировать ее.

Подробнее о том, как это сделать, см. Как: загрузить сборки в домен приложения и Выгрузить домен приложения .

3 голосов
/ 17 марта 2017

Увидел этот вопрос и ответ, и он мне помог.Однако для тех, кому нужно подробное объяснение того же, я нашел ссылку , которая действительно полезна.

Выдержка из ссылки.

Использование различныхверсии одной и той же библиотеки DLL в одном приложении

шаг 1: использование VS IDE .Добавьте ссылку на обе библиотеки в вашем клиентском приложении.Затем в обозревателе решений под узлом ссылки выберите первую (старую версию) библиотеку классов.В окне свойств измените поле Псевдонимы с global на oldVer .lly, newVer для версии N ewer .

Шаг 2: используйте приведенный ниже код в качестве первого утверждения, где вы планируете ссылаться на него

extern alias oldVer;
extern alias newVer;

теперь использовать,

Console.WriteLine(oldVer::MyLibrary.MyClass.method());
Console.WriteLine(newVer::MyLibrary.MyClass.method());

Надеюсь, это поможет.

0 голосов
/ 11 июня 2010

Вы можете загрузить первую сборку во время выполнения, а затем использовать отражение, чтобы создать ее экземпляр и выполнить ее метод. Затем выгрузите эту сборку, загрузите вторую сборку и используйте отражение, чтобы создать ее и запустить ее методы.

Вероятно, было бы проще использовать 2 отдельных процесса, а затем сравнить полученный результат ...

...