Мне нужно работать над преобразованием очень большого проекта C++ в clr safe. В текущем проекте C++ есть много вещей из C++, таких как шаблоны, дженерики, указатели, хранилище/поток, ole apis, сжатие zlib apis, встроенные строки и т. Д. Где я могу найти документ datile для такого типа преобразования? Можете ли вы предложить какую-нибудь хорошую книгу? Если кто-то из вас сделал такое преобразование, могу ли я получить от вас какой-нибудь анализ?Преобразование проекта C++ в безопасный проект clr
ответ
Подавляющее большинство родных C++ является полностью допустимым C++/CLI, включая шаблоны, встроенные линии и т. Д., За исключением того, что CLR STL довольно медленный по сравнению с BCL. Кроме того, у родного C++ нет дженериков, только шаблонов.
Реальность компиляции как C++/CLI заключается в проверке коммутатора и нажатии компиляции и дождаться его появления ошибок.
Я просто кашлять статью 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++ в проверяемый код. Вы уверены, что это стоит инвестиций?
Переписывание родного C++ в safe C++/CLI приведет к синтаксически отличающемуся, но семантически совпадающему с C#. Если это так, почему бы не переписать прямо в C#?
Если вы хотите, чтобы избежать того, что, по существу, полностью переписан, рассмотрим следующие варианты:
- P/Invoke. К сожалению, я не знаю, будет ли это изолировать сейф от небезопасного кода. Даже если он может выполнять изоляцию, вам необходимо свернуть существующий код на C++ в процедурный C-подобный API, чтобы его можно было использовать P/Invoke. С положительной стороны, если ваш API слишком частый, вы можете сохранить (большую часть) свою собственную производительность.
- Оберните свой C++ в внекорпоративный COM-сервер и используя COM Interop, чтобы использовать его из управляемого кода. Таким образом, ваш управляемый код полностью защищен от любого повреждения, которое может произойти на C++ и может оставаться «безопасным». Недостатком является поражение производительности, которое вы получите для маршалинга вне процесса и усилий по реализации, которые вам нужно потратить, чтобы правильно реализовать COM.
шаблоны, p/invoke с использованием собственных файлов заголовков, семантики стека для лучшего управления одноразовыми объектами, C++/CLI на самом деле имеет много возможностей, которые C# не делает. Можно утверждать, что это компенсирует clunkier свойство и синтаксис событий и т. Д. –
Подавляющее большинство C++ - это C++/CLI, но не «безопасный» C++/CLI. Все, что касается родных классов или указателей, недействительно в «безопасном» режиме. –