Класс с тем же именем в двух блоках (намеренно)

Я нахожусь в процессе миграции библиотеки, которая записана в 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 будет, конечно, работать, но нас попросили не сделать это для хранения клиентского кода легче мигрировать.

33
задан pgb 10 June 2010 в 20:52
поделиться

3 ответа

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

60
ответ дан 27 November 2019 в 18:05
поделиться

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

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

4
ответ дан 27 November 2019 в 18:05
поделиться

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

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

0
ответ дан 27 November 2019 в 18:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: