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