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

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

Решение

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

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

Выписка из ссылки.

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

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

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

extern alias oldVer;
extern alias newVer;

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

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

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

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

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

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

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

Другие вопросы по тегам