Перенос неуправляемого проекта C ++ на C # - PullRequest
2 голосов
/ 27 августа 2010

по нескольким причинам мне нужно перенести неуправляемый проект C / C ++ (VS 2008) на C # (предпочтительно .net 3.5).

Мне нужно знать:

  • существуют ли случайно какие-либо инструменты, помогающие конверсии;скажем, что-то переводя синтаксис кода и спрашивая у вас проверки / модификации для каждой проблемной точки (наверное, я мечтаю ...)
  • где найти несколько полезных статей / статей ... об этом,Они были бы очень полезны, если бы они содержали определенные подсказки, такие как:

    extern variables должны быть установлены в публичных статических классах (я не знаю, я предполагаю ...)

Пожалуйста, не предлагайте, например, "Вы можете позвонить на свой c ++ dll из .net", потому что я знаю, что это возможно, но просто не могу.


PS

Я искал на Goole и SO, прежде чем спрашивать, но я не мог найти какую-либо ссылку / вопрос / ответ, похожий или достаточно полезный.Если вы нашли его или считаете, что этот вопрос необходимо закрыть, пожалуйста, не стесняйтесь

PPS

Извините за мой плохой английский.


РЕДАКТИРОВАТЬ:

Некоторые дополнительные сведения:

  • В проекте C / C ++ используются только STL и другие базовые функции, нет сторонних библиотек и т. Д.
  • Iне может использовать его directclty или перенесено из C #, потому что нашей компании нужно поддерживать / изменять код, и мы чрезвычайно опытны в c #, чем в c ++.

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Это будет стоить вам гораздо дороже, чем конвертировать его и заплатить внештатному сотруднику (как я), который поможет вам, меняя код C ++ для вас каждые несколько месяцев (или каждые несколько лет), когда вам нужно менять. Есть некоторые механические подходы, но большая проблема в том, что вы никогда не можете быть уверены, что новый код C # делает именно то, что делал старый код C ++. У меня есть клиенты, которые попробовали это, и большинство сдалось и выбросило работу. Те, кто преуспел, делали это очень медленно, вот так:

Сначала вы оборачиваете старую библиотеку и получаете свой пользовательский интерфейс или любой новый код (веб-сервис, что угодно), успешно вызывающий старую библиотеку. Это заставляет всех «биться за доллар» и тратить время на решение проблемы «мы не можем поддерживать наш старый код». Вы также разрабатываете комплексный набор тестов, который доказывает, что старая библиотека делает для различных крайних случаев и странных вещей, которые случаются только в дикой природе каждые несколько лет. Со временем вы перемещаете функциональность из старой библиотеки в новую C # и изменяете вызывающий код, чтобы использовать новую библиотеку для этой функциональности. Вы перемещаете самые изменчивые части, то, что вы меняете чаще всего, в первую очередь. На каждом этапе вы снова запускаете тестовые примеры, чтобы убедиться, что ваш перевод с C ++ на C # не испортил результаты, которые он вычисляет. Возможно, что-то из этого вы никогда не покидаете, может быть, в конце концов, все это перемещено. Вы останавливаетесь, когда чувствуете, что не можете содержать свою собственную библиотеку и вынуждены платить кому-то за это, чтобы упасть ниже стоимости продолжения перевода.

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

1 голос
/ 27 августа 2010

Я сомневаюсь, что инструменты преобразования кода помогут. Если вам нужно как-то работать с C ++ с .NET, проще всего написать управляемый слой C ++, который обернет его и предоставит интерфейс для работы с приложениями .NET. Но это зависит от кода.

Какова цель переписывания и что делает ваш код? Это взаимодействует с другими компонентами? У него есть графический интерфейс? Это автономный исполняемый файл или библиотека? Это сервер COM / ActiveX или он использует компоненты COM? Он ссылается на другие библиотеки DLL или использует сторонние библиотеки?

Все это влияет на то, как вы собираетесь переносить / переписывать приложение с нуля. Например, если ваш код представляет собой приложение MFC, вы также можете забыть попытаться спасти большой объем кода. Если ваше приложение работает с http / high level network, вы можете также писать с нуля. Если ваш код низкого уровня, вам может потребоваться рефакторинг с некоторым C # и некоторым C ++, доступным через управляемый слой C ++.

Много вариантов, и это действительно зависит от того, что делает ваше приложение, как оно было написано и т.д.

1 голос
/ 27 августа 2010

Зависит от того, что вы подразумеваете под портом.

Вы можете переписать некоторые вещи в C #. Не все. Некоторые библиотеки HW или устаревшие библиотеки придется обрабатывать с помощью C / C ++, даже если вы портируете свой собственный код. Я не знаю ни одного надежного автоматического конвертера для C ++ -> C #, и я сомневаюсь, что он может существовать.

Лучшая идея может заключаться в том, чтобы обернуть существующий код в новый код C #. Например, вы можете создать уровень взаимодействия в C ++ / CLI. Или вы можете общаться со своим собственным кодом с помощью чего-то вроде буферов протокола Google, если вы не хотите смешивать собственный / управляемый код в одном процессе.

...