2010-08-21 2 views
2

Мне нужно работать над преобразованием очень большого проекта C++ в clr safe. В текущем проекте C++ есть много вещей из C++, таких как шаблоны, дженерики, указатели, хранилище/поток, ole apis, сжатие zlib apis, встроенные строки и т. Д. Где я могу найти документ datile для такого типа преобразования? Можете ли вы предложить какую-нибудь хорошую книгу? Если кто-то из вас сделал такое преобразование, могу ли я получить от вас какой-нибудь анализ?Преобразование проекта C++ в безопасный проект clr

ответ

1

Подавляющее большинство родных C++ является полностью допустимым C++/CLI, включая шаблоны, встроенные линии и т. Д., За исключением того, что CLR STL довольно медленный по сравнению с BCL. Кроме того, у родного C++ нет дженериков, только шаблонов.

Реальность компиляции как C++/CLI заключается в проверке коммутатора и нажатии компиляции и дождаться его появления ошибок.

+0

Подавляющее большинство C++ - это C++/CLI, но не «безопасный» C++/CLI. Все, что касается родных классов или указателей, недействительно в «безопасном» режиме. –

2

Я просто кашлять статью MSDN Library под названием «Как: Перенесите в/CLR: безопасный

Visual C++ может генерировать проверяемые компоненты с помощью/CLR: сейф, который заставляет компилятор генерировать ошибки для каждый не проверяемых код конструкт

следующие вопросы, порождают ошибки проверяемости:..

  • родные типы Даже если он не используется, декларация нативных классов, структур, указателей и массивов будут препятствовать компиляции .
  • Глобальных переменные
  • вызовов функций в любую неуправляемую библиотеку, в том числе функции выполнения общего языка вызывает
  • поддающаяся проверке функция не может содержать static_cast Оператора для понижающей литьи. Оператор static_cast может использоваться для литья между примитивными типами, но для down-casting необходимо использовать safe_cast или листинг C-Style (который реализуется как safe_cast).
  • Поддающаяся проверке функция не может содержать оператор reinterpret_cast (или любой эквивалент литья в стиле C).
  • Подтверждаемая функция не может выполнять арифметику на inner_ptr. Он может только назначать ему и разыгрывать его.
  • Поддающаяся проверке функция может только бросать или улавливать указатели на ссылочные типы, поэтому типы значений должны быть помещены в бокс перед броском.
  • Подтверждаемая функция может вызывать только проверяемые функции (так что вызовы на общий язык исполнения не допускаются, включают AtEntry/AtExit, и поэтому глобальные конструкторы запрещены).
  • Подтверждаемый класс не может использовать Явные.
  • При построении EXE основная функция не может объявлять какие-либо параметры, поэтому GetCommandLineArgs должен использоваться для извлечения аргументов командной строки.
  • Выполнение виртуального вызова виртуальной функции.

Кроме того, следующие ключевые слова не могут быть использованы в поддающейся проверке кода:

  • неуправляемых и вьючных прагмами
  • догола и выравнивают __declspec модификаторы
  • __asm ​​
  • __based
  • __try и __except

Я считаю, что вы будете заняты какое-то время. Волшебной палочки не нужно волноваться, чтобы превратить собственный C++ в проверяемый код. Вы уверены, что это стоит инвестиций?

1

Переписывание родного C++ в safe C++/CLI приведет к синтаксически отличающемуся, но семантически совпадающему с C#. Если это так, почему бы не переписать прямо в C#?

Если вы хотите, чтобы избежать того, что, по существу, полностью переписан, рассмотрим следующие варианты:

  • P/Invoke. К сожалению, я не знаю, будет ли это изолировать сейф от небезопасного кода. Даже если он может выполнять изоляцию, вам необходимо свернуть существующий код на C++ в процедурный C-подобный API, чтобы его можно было использовать P/Invoke. С положительной стороны, если ваш API слишком частый, вы можете сохранить (большую часть) свою собственную производительность.
  • Оберните свой C++ в внекорпоративный COM-сервер и используя COM Interop, чтобы использовать его из управляемого кода. Таким образом, ваш управляемый код полностью защищен от любого повреждения, которое может произойти на C++ и может оставаться «безопасным». Недостатком является поражение производительности, которое вы получите для маршалинга вне процесса и усилий по реализации, которые вам нужно потратить, чтобы правильно реализовать COM.
+0

шаблоны, p/invoke с использованием собственных файлов заголовков, семантики стека для лучшего управления одноразовыми объектами, C++/CLI на самом деле имеет много возможностей, которые C# не делает. Можно утверждать, что это компенсирует clunkier свойство и синтаксис событий и т. Д. –