Я пытаюсь записать интеграцию с операционной системой и с вещами как активный каталог и Ocropus.
Я знаю набор языков программирования, включая перечисленных в заголовке. Я пытаюсь изучить точно, как C++ / работы CLI, но не может найти сжатые, точные и детальные описания онлайн от поиска, который я сделал. Таким образом, я спрашиваю здесь.
Вы могли сказать мне ловушки и функции C++ / CLI? Предположите, что я знаю все C# и запускаюсь оттуда. Я не эксперт в C++, таким образом, некоторые ответы моих вопросов могли бы быть "точно так же, как C++", но могли сказать, что я в C#. Я хотел бы знать вещи как:
Примечание: Я действительно спрашиваю об особенностях C++ / CLI, его лазейки.
Преобразование указателей 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 здесь сильно поможет.
Начнем с того, что вы путаете ныне несуществующие "Управляемые расширения для 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 ничего не меняет в этой области.
У вас действительно слишком много очков для одного вопроса. Если вы действительно хотите, чтобы я прошел через все пункты, я это сделаю, но это будет серия записей в блоге, и я просто оставлю здесь ссылку.