Сжатое введение в C++ / CLI для C#/Haskell/F#/JS/C ++ / … программист

Я пытаюсь записать интеграцию с операционной системой и с вещами как активный каталог и Ocropus.

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

Вы могли сказать мне ловушки и функции C++ / CLI? Предположите, что я знаю все C# и запускаюсь оттуда. Я не эксперт в C++, таким образом, некоторые ответы моих вопросов могли бы быть "точно так же, как C++", но могли сказать, что я в C#. Я хотел бы знать вещи как:

  • Преобразование указателей C++ на указатели CLI,
  • Какие-либо различия мимоходом значением/вдвойне косвенные указатели указателей/CLI от C#/C ++ и что 'рекомендуется'.
  • Как делают gcnew, __, gc, __ nogc работают с
    • Полиморфизм
    • Структуры
    • Внутренние классы
    • Интерфейсы
  • "Фиксированное" ключевое слово; это существует?
  • Компиляция DLLs, загруженного в ядро C++ / возможный CLI? Загруженный как драйверы устройств? Вызванный ядром? Что делает это означает так или иначе (т.е. загрузить что-то в ядро точно; как я знаю, ли это?)?
  • L "моя строка" по сравнению с "моей строкой"? wchar_t? Сколько типы символов там?
  • Действительно ли мы в безопасности в обработке символов как uint32s или что нужно рассматривать их для гарантии безразличия языка к коду?
  • Финализаторам (~ClassName () {}) препятствуют в C#, потому что нет никаких garantuees, которые они выполнят детерминировано, но с тех пор в C++, который я должен использовать, "удаляют" или используют копию-c'tors для укладки, выделяют память, каковы рекомендации между C#/C ++ взаимодействия?
  • Каковы ловушки при использовании отражения в C++ / CLI?
  • Как хорошо делает C++ / работа CLI с шаблоном IDisposable и с SafeHandle, SafeHandleZeroOrMinusOneIsInvalid?
  • Я читал кратко об асинхронных исключениях при выполнении операций DMA, что они?
  • Есть ли ограничения, которые Вы налагаете на себя при использовании C++ с интеграцией CLI вместо того, чтобы просто делать плоскость C++?
  • Атрибуты в C++, подобном Атрибутам в C#?
  • Я могу использовать полные шаблоны метапрограммирования, доступные в C++ через шаблоны теперь, и все еще иметь его компиляция как обычный C++?
  • Вы попытались писать C++ / CLI с повышением?
  • Что является оптимальными способами соединить интерфейсом с библиотекой повышения с C++ / CLI; можно ли дать мне пример передачи лямбда-выражения к функции iterator/foldr?
  • Каков предпочтительный способ обработки исключений? Может C++ / выгода CLI справился с исключениями теперь?
  • Как хорошо динамическое поколение IL работает с C++ / CLI?
  • Это работает Моно?
  • Какие-либо другие вещи я должен знать о?

Примечание: Я действительно спрашиваю об особенностях C++ / CLI, его лазейки.

7
задан 3 revs, 2 users 100% 16 April 2010 в 20:31
поделиться

2 ответа

Преобразование указателей C++ в указатели CLI

Типы CLI не обязательно должны быть указателями. В C++/CLI используется дескриптор (^).

Любые различия в передаче по значению/двойные косвенные указатели/CLI указателей от C#/C++ и что из этого рекомендуется.

Если вам нужна лучшая совместимость с C#, избегайте использования указателей. Используйте все связанные с указателями вещи в C++/CLI и выставляйте только управляемые типы, чтобы приложения C# могли легко их использовать.

Ключевое слово "fixed"; существует ли оно?

pin_ptr<> - эквивалент.

Финализаторы (~ClassName() {}) не рекомендуются в C#, потому что нет никаких гарантии, что они будут выполняться детерминированно, но поскольку в C++ я приходится использовать "delete" или использовать copy-c'tors как для выделения стека памяти, каковы рекомендации между взаимодействием C#/C++?

C++/CLI поддерживает детерминированное управление ресурсами. Когда вы пишете деструктор, компилятор реализует интерфейс IDisposable на классе и преобразует деструктор в метод Dispose(). delete будет вызывать этот Dispose(), чтобы выполнить деаллокацию ресурсов. Поэтому у вас не возникнет проблем с его использованием из C#. Вы можете обернуть использование в оператор using в C#, который обеспечит вызов Dispose.

Атрибуты в C++ похожи на Атрибуты в C#?

Да, они похожи.

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

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

Пробовали ли вы писать на C++/CLI с помощью boost?

C++/CLI имеет доступ ко всему фреймворку .NET. Я не думаю, что boost здесь сильно поможет.

5
ответ дан 7 December 2019 в 01:19
поделиться

Начнем с того, что вы путаете ныне несуществующие "Управляемые расширения для C ++", в которых есть ключевые слова __gc и __nogc, с новым и поддерживаемым в настоящее время C ++. / CLI, который, наконец, обеспечивает правильное различие между указателями (родными) и дескрипторами (управляемыми объектами, они фактически реализованы как указатели в память со сборкой мусора, где находятся объекты .NET, но вы не должны думать о них как о указателях, потому что они автоматически настраиваются сборщиком мусора). Эти два типа указателей полностью различны, только встроенные типы совместимы с обоими, а затем вы просто упаковываете их, чтобы получить дескриптор. У вас никогда не может быть дескриптора, указывающего за пределы управляемой кучи, и вы можете получить собственный указатель в управляемую кучу только на время существования pin_ptr (только в локальной области). Управляемый класс может содержать указатель на собственную память, точно так же, как C # может иметь члены IntPtr. Собственные типы могут содержать дескрипторы управляемых объектов с использованием шаблонного типа gcroot, который является оболочкой для System :: GCHandle.

Компилятор Microsoft C ++ / CLI может генерировать либо чистый MSIL, либо смесь MSIL и собственного кода, в зависимости от того, используете ли вы / clr или / clr: pure или / clr: safe (последнее ограничивает / clr: pure для создания только проверяемого MSIL). Ответы на большинство ваших других вопросов зависят от того, в каком из этих режимов он находится. Например, любой созданный им MSIL будет работать в Mono, а смешанный собственный и MSIL - нет, потому что он полагается на внутренние компоненты среды выполнения Microsoft .NET. .

Любые ограничения применяются только к управляемым типам (например, ref class, enum class), созданным с помощью C ++ / CLI. Собственные типы, даже если они скомпилированы в чистый MSIL, обладают полной гибкостью языка C ++, включая множественное наследование, шаблоны и т. Д.

C ++ / CLI перехватывает управляемые типы исключений как в машинном, так и в управляемом коде (/ clr заставляет компилятор / EHa вариант).

C ++ / CLI предоставляет синтаксис семантики стека (объявление переменной, тип которой не включает дескриптор значения суффикса ^). Это возможно как для локальных переменных, так и для членов управляемых типов. Компилятор автоматически производит вызовы IDisposable :: Dispose для типов, которые реализуют его во всех обычных местах (например, C # using блок для локальных переменных, автоматически создает реализацию IDisposable в управляемых типах, которая вызывает Dispose для всех членов).

Лямбды пока недоступны, потому что в следующей версии Visual Studio (2010) они будут добавлены с использованием синтаксиса, определенного будущим стандартом C ++.

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

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

5
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: