С++ CLI Правильный способ использования #pragma управляемых/неуправляемых
Я пишу приложение С++/CLI, но хочу, чтобы большая часть кода в моей С++ DLL запускалась изначально (т.е. не управлялась).
У меня есть только один класс CLI в модуле, другие файлы - все родные С++.
Итак, каков наилучший способ обеспечить, чтобы эти классы были запущены... Ну, изначально?
Должен ли я:
- A) Добавьте #pragma неуправляемой в начало каждого родного класса
- B) Просто добавьте #pragma неуправляемый до включения в мой единственный класс CLI
- C) Что-то еще?
Спасибо
Ответы
Ответ 1
Вам не нужно прыгать через обручи, чтобы это обеспечить. Компилятор будет генерировать IL только когда он скомпилирует вашу программу с включенной опцией /clr. Это похоже на вариант проекта, но это не так.
Просто выберите файлы .cpp, содержащие собственный код. Выберите более одного из них, удерживая клавишу Ctrl и щелкая по файлу в окнах проводника. Щелкните правой кнопкой мыши + Свойства, C/С++, Общие. Измените настройку "Common Language Runtime Support" на "Нет...".
Ответ 2
Обычно я делаю это, чтобы поместить собственный код в проект статической библиотеки без поддержки .NET(скомпилировать без /clr
). Вы можете отключить /clr
для отдельных файлов в проекте С++/CLI, но предварительно сконфигурированные заголовки очень запутаны. Используя отдельный проект библиотеки, легко получить собственный pch для собственного кода и управляемый pch для управляемого кода.
Затем я связываю свой код С++/CLI с этим родным С++.lib для создания DLL. Все, что вам нужно, - установить зависимость проекта, а Visual Studio позаботится об остальном.
Вы также можете использовать #pragma managed(push, off)
и #pragma managed(pop)
, если вам абсолютно необходимо комбинировать собственный и управляемый код в одном модуле компиляции. Но обычно любой код, который есть в заголовочных файлах, существует, потому что вы намереваетесь его встроить... что означает, что он должен находиться в управляемом режиме, когда он включен в управляемый CU, поэтому он может быть встроен в управляемые функции.
Несмотря на то, что он комментирует этот ответ, Ганс начал рекомендовать мой подход.