Есть ли небезопасный эквивалент C # в C ++ / CLI? - PullRequest
4 голосов
/ 22 июля 2011

Я пытаюсь перенести код C ++ / CLI в Verifiable Type-Safe код C ++ / CLI (используйте флаг clr: safe), чтобы я мог получить сборку AnyCPU.Основная проблема компиляции, которую я нахожу, заключается в том, что я получаю много ошибок C4956 и думаю, что это можно решить, явно указав компилятору, что я ожидаю, что это небезопасно.Предложения?

Ответы [ 4 ]

2 голосов
/ 23 июля 2011

Это было рассмотрено здесь

По сути, это то, что /clr:pure должен был обеспечить, потому что он также генерирует чистую сборку MSIL.К сожалению, это все еще вызывает зависимость от конкретной битности, поэтому не совместимо с AnyCPU.

2 голосов
/ 22 июля 2011

C ++ / CLI может свободно смешиваться с кодом C ++ и по своей сути небезопасен, поэтому не требуется никакого эквивалента, кроме самого языка. Используйте pin_ptr, чтобы определить объекты и буферы для сбора мусора, и теперь у вас есть указатель стиля C ++ для использования. Вы также можете использовать C ++ STL, небезопасные преобразования и т. Д. Для таких указателей.

2 голосов
/ 22 июля 2011

У вас не должно возникнуть проблем при переносе небезопасного кода из C # в CLI, просто обязательно используйте IntPtr , который является указателем, независимым от CLS-совместимой архитектуры.

Если вы столкнулись с конкретными проблемами или не уверены в чем-либо, обновите вопрос с более подробной информацией.

1 голос
/ 22 июля 2011

Для ответа на этот вопрос у нас есть:

/ clr: safe Создает проверяемую сборку только для MSIL. Вы не можете иметь нативные типы в вашем код, и если вы попытаетесь использовать их, компилятор выдаст ошибку. Этот сборник Режим производит сборки, которые эквивалентны тому, что C # (обычный режим) и VB.NET будет производить.

Для работы с типобезопасным кодом вам нужно использовать указатели (используя gcnew) вместо указателей (используя new)

Кроме того, оператор safe_cast является новым для C ++ / CLI и заменяет __try_cast в старый синтаксис. safe_cast гарантированно создает проверяемый MSIL. Вы можете использовать safe_cast везде, где вы обычно используете dynamic_cast, reinterpret_cast или static_cast. Во время выполнения safe_cast проверяет посмотреть, действителен ли акт

Вы должны взять копию: C ++ / CLI в действии Нишанта Сивакумара Очень хорошая ссылка на C ++ / CLI

...