Подтвердить что ты не робот

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

Я выполняю миграцию библиотеки, написанной на С++, и имеет оболочку С#. Оболочка С# (LibWrapper) имеет набор классов с пространствами имен, например:

namespace MyNamespace
   class MyClass
   class MyOtherClass

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

namespace MyNamespace
   class MyClass
   class MyOtherClass

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

Есть ли какой-либо трюк в этой проблеме, который позволит мне использовать два класса с одним и тем же именем, но из разных сборок в одном и том же клиентском коде?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Извлеките ссылку.

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

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

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

extern alias oldVer;
extern alias newVer;

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

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

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

Ответ 4

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

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