Мое приложение неуправляемое. С чего начать знакомство с управляемым кодом? - PullRequest
6 голосов
/ 17 декабря 2009

Все мое приложение (довольно большое, с исполняемым файлом размером 20 МБ) написано на неуправляемом C ++. Поскольку я четко вижу преимущества использования управляемого кода, я хочу начать вводить управляемый код в свое приложение, но с чего мне начать?

Могу ли я легко начать использовать C ++ / CLI и связать его с остальной частью моего приложения? (хотя синтаксис C ++ / CLI кажется довольно «экзотическим»).

Или лучше перейти на C #, но как лучше связать это вместе с моим неуправляемым кодом C ++?

Имеет ли смысл компилировать весь мой код C ++ с параметром / clr? Будет ли это работать?

Должен ли я беспокоиться о сортировке? Дает ли это накладные расходы или я могу переключаться между управляемым и неуправляемым без снижения производительности (как я это делал 20 лет назад, когда смешивал Fortran и C). Производительность действительно важна для моего приложения, поскольку это научное приложение, которое иногда обрабатывает несколько гигабайт памяти.

Или имеет смысл только перепроектировать пользовательский интерфейс и записать его только на C # и оставить оставшуюся часть моего приложения (логику вычислений, бизнес-логику, интерфейс базы данных и т. Д.) В неуправляемом C ++?

Поскольку моему приложению иногда требуется обрабатывать несколько гигабайт памяти, у меня есть 64-разрядный вариант. Легко ли иметь 64-битный управляемый код? Будет ли сборщик мусора все еще эффективен, если используется столько памяти?

Просто укажите: с чего мне начать?

Patrick

Ответы [ 3 ]

1 голос
/ 18 декабря 2009

Мы делаем именно то, что вы описали в критически важном приложении, которое используют тысячи пользователей. По сути, мы сохранили существующее приложение как есть, поэтому исполняемый файл по-прежнему остается неуправляемым на 100% (не C ++ / CLI). Затем мы помещаем весь наш новый код C # в DLL-библиотеки .NET, которые состоят из бизнес-объектов, пользовательских элементов управления, графического кода и т. Д. ...

По сути, весь новый код написан на C #. У нас есть 1 dll, который является C ++ / CLI, который является просто клеем. Это позволяет нам легко взаимодействовать между управляемым и неуправляемым кодом, не делая существующий код C ++ clr. Это ограничивает объем кода C ++ / CLI, который мы должны написать. Нативный код взаимодействует с кодом смешанного режима, который может взаимодействовать с управляемым кодом. DLL смешанного режима может перехватывать события в классах C #, поэтому код C # может просто вызывать событие для связи с C ++ / CLI (который может общаться с собственным кодом).

Мы также можем размещать .NET UserControls в существующем приложении C ++ (в любом случае WinForms является просто оболочкой для WINAPI, поэтому она работает довольно хорошо).

Это работает очень хорошо и позволяет сохранить существующий код без необходимости переписывать весь графический интерфейс в C #.

1 голос
/ 10 февраля 2010

В данный момент этот вопрос считается закрытым.

Я понял, что ответ не в том, чтобы смешивать C ++ и C #, а в том, чтобы правильно понять архитектуру.

Если архитектура правильная и разделена там, где ее необходимо разделить, то изменение частей приложения другими модулями (внешним, другим языком, ...) должно быть проще.

Что касается проблем с производительностью во время маршаллинга, нам придется подождать, пока .Net станет более зрелым.

1 голос
/ 17 декабря 2009

Профилируйте приложение, решайте, в каких точках интеграции вы можете отключить логику C # и перейти в C ++ и наоборот. Организовать их в план, чтобы шаблон проектирования Facade перемещался по системе, постепенно заменяя C ++ на C #. Ключевой проблемой является стоимость процессора и памяти при принятии решения о переключении языков на каждом подходящем фасаде / интерфейсе.

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

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

Также идеально структурируйте свою работу, чтобы вы могли откатить фасад, чтобы вернуться к 100% C ++, если вы наткнетесь на препятствие.

Чтобы проверить, можно ли разделить пару особенно непостижимых модулей C ++ на кусок C ++ и кусок C #, запустите их в двух разных процессах Win32 C ++, взаимодействующих с использованием канала или сокета. Таким образом, вы получите лучшее представление о том, есть ли проблемы с управлением памятью или производительностью, которые необходимо исправить, прежде чем вы сможете разделить цепочку вызовов на этом этапе.

...