Класс с таким же именем в двух сборках (намеренно)
Я выполняю миграцию библиотеки, написанной на С++, и имеет оболочку С#. Оболочка С# (LibWrapper
) имеет набор классов с пространствами имен, например:
namespace MyNamespace
class MyClass
class MyOtherClass
Моя новая библиотека LibraryCS
содержит те же пространства имен и имена классов, что и LibWrapper
(для каждого пользовательского требования), поэтому у меня также есть:
namespace MyNamespace
class MyClass
class MyOtherClass
Теперь, когда миграция завершена, я собираюсь создать тест, который сравнивает результаты использования обеих библиотек, для проверки миграции. Однако, когда я пытаюсь ссылаться на MyNamespace.MyClass
, я получаю ошибку компилятора (предположительно!), В которой говорится: "MyNamespace.MyClass определен как в LibWrapper, так и в LibraryCS".
Есть ли какой-либо трюк в этой проблеме, который позволит мне использовать два класса с одним и тем же именем, но из разных сборок в одном и том же клиентском коде?
Альтернативно, есть ли другой способ проверить это?
Переименование перенесенного пространства имен на что-то вроде MyNamespace2
, конечно, будет работать, но нас попросили не делать этого, чтобы упростить перенос кода клиента.
Ответы
Ответ 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 отдельных процесса, а затем сравнить полученный результат...