Подтвердить что ты не робот

С++ CLI Правильный способ использования #pragma управляемых/неуправляемых

Я пишу приложение С++/CLI, но хочу, чтобы большая часть кода в моей С++ DLL запускалась изначально (т.е. не управлялась).

У меня есть только один класс CLI в модуле, другие файлы - все родные С++.

Итак, каков наилучший способ обеспечить, чтобы эти классы были запущены... Ну, изначально?

Должен ли я:

  • A) Добавьте #pragma неуправляемой в начало каждого родного класса
  • B) Просто добавьте #pragma неуправляемый до включения в мой единственный класс CLI
  • C) Что-то еще?

Спасибо

4b9b3361

Ответ 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, поэтому он может быть встроен в управляемые функции.


Несмотря на то, что он комментирует этот ответ, Ганс начал рекомендовать мой подход.