Я нахожусь в процессе миграции библиотеки, которая записана в 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
будет, конечно, работать, но нас попросили не сделать это для хранения клиентского кода легче мигрировать.
Вы можете использовать extern alias для ссылки на типы с одинаковым полным именем из разных сборок. Выберите ссылку на LibraryCS и обновите Aliases на странице свойств с "global" на "LibraryCS", а также добавьте extern alias LibraryCS;
в начало вашего исходного файла, после чего вы можете использовать LibraryCS::MyNamespace.MyClass
для ссылки на класс в LibraryCS. Вы можете использовать MyNamespace.MyClass
или global::MyNamespace.MyClass
для ссылки на класс в LibWrapper, или вы можете использовать псевдоним для этой ссылки.
Чтобы загрузить оба этих класса в один исполняемый файл, вы можете загрузить их в отдельном домене приложения. Это позволит вам протестировать сборку, затем полностью выгрузить ее, загрузить вторую и протестировать.
Для получения подробной информации о том, как это сделать, см. Как: загрузить сборки в домен приложения и Выгрузить домен приложения .
Вы можете загрузить первую сборку во время выполнения, а затем использовать отражение, чтобы создать ее экземпляр и выполнить ее метод. Затем выгрузите эту сборку, загрузите вторую сборку и используйте отражение, чтобы создать ее и запустить ее методы.
Вероятно, было бы проще использовать 2 отдельных процесса, а затем сравнивать полученный результат ...