Разделение проекта VB/C# и ссылок

Я унаследовал проект, написанный в основном на VB. Я хотел бы сохранить то, что у меня есть в VB при медленном преобразовании в C#, когда смогу. Единственный способ сделать это - создать отдельный проект на C#. Однако это вызывает проблемы из-за зависимостей и ссылок. Я не могу иметь VBProject ссылка CSharpProject и наоборот, потому что это создает круговую ссылку. Это проблема, потому что мне нужно, чтобы оба проекта могли ссылаться на другие. Есть ли лучший способ сделать это, или я застрял писать в VB (или полностью перевод на C#)?

Также эти проекты находятся в одном решении. Должен ли я быть в состоянии импортировать / использовать их без создания ссылки или каким-либо другим более простым способом?

4 ответа

Решение

Нет необходимости обходить круговые ссылки.

Когда в прошлом я сталкивался с подобной ситуацией, переходя с языка A на язык B, я начал с рефакторинга битов кода языка A, чтобы они не зависели от большей части кодовой базы. Затем я перевел бы эти изолированные части на язык B и интегрировал их так, чтобы основная программа теперь зависела от новых модулей. В конце концов, все, что осталось, было основной программой.

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

Инверсия Контроля поможет вам в выполнении такой миграции. Недавно я решил аналогичную проблему, когда меня попросили добавить значительную функциональность в непроверенный код VB.Net на клейкой ленте. Я хотел извлечь существующую уязвимую функциональность из VB.Net и поместить ее в модульную сборку C#.

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

Например, даны классы Alpha, Bravo и Charlie в сборке VB.Net, где у Alpha есть ссылка на Bravo. Вы хотите извлечь Браво, но в нем есть ссылка на Чарли. Определите интерфейс под названием ICharlie в проекте C#, который содержит членов в Charlie, о которых заботится Bravo. В проекте VB.Net измените Чарли: ICharlie. Когда вы создаете Bravo, он принимает зависимость типа ICharlie.

Преимущество такого подхода, даже в рамках одного и того же проекта или набора проектов, заключается в тестируемости. Зависимости между классами хорошо известны и могут быть заменены макетами / заглушками, так что такие классы, как Bravo, можно тестировать, не беспокоясь о том, чтобы установить его в реальной реализации ICharlie.

Вы не сможете сделать это, пока проект C# зависит от проекта VB.

Вам нужно извлечь классы из проекта VB.net в проект C#, чтобы классы / функции были автономными и не зависели от проекта VB.

Это то, с чем я борюсь каждый день на работе, и я медленно двигаюсь к свету (C#)

Если вы не можете извлечь конкретные элементы в новый проект C# для ссылки, вам придется все это переписать. Если это проект веб-приложения или проект Windows Forms, вы не можете поддерживать какой-либо гибрид в одном проекте. Если у вас есть проект веб-сайта, вы можете указать язык для каждой отдельной страницы, который позволит вам иметь гибрид. Однако это очень грязно, и вам будет гораздо лучше выделить время, чтобы переписать все это в C# или приспособиться к записи в VB.

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