2012-05-23 5 views
1

У меня есть несколько конкретных вопросов, касающихся смешивания управляемых C++ с неуправляемым C++:Смешивание управляемого и неуправляемого кода на C++?

  1. Если я уйду из ref и value в объявлении класса/структуры, значит ли это автоматически делает класс/структура неуправляемый? Или мне еще нужно включить директивы #pragma unmanaged и #pragma managed?
  2. Насколько совместимы неуправляемые и управляемые типы? Например, я могу иметь неуправляемый объект в управляемом классе, не так ли? Могу ли я передать неуправляемый класс/struct в управляемую функцию (т.е. передать std :: string в управляемую функцию)?

Спасибо за вашу помощь,

Alex

ответ

2

Вы не можете иметь гибридные типы (родной класс, содержащий управляемый объект, или наоборот). Возможно, есть указатель на собственный класс внутри управляемого и управляемый дескриптор, завернутый в шаблон gcroot внутри собственного класса. Это необходимо, чтобы убедиться, что сборщик мусора никогда не пытается перемещать собственные данные (что приведет к разрыву указателей, содержащихся в чистом собственном коде).

Управляемые типы всегда реализуются с использованием управляемого кода. Родные типы должны быть реализованы с использованием управляемого кода, если они обращаются к управляемым типам.

#pragma managed(push, off) - способ принудительно скомпилировать код как родной. Пара причин для этого: лучшая оптимизация от компилятора C++, не может быть прервана сборкой мусора и т. Д. В качестве альтернативы вы можете использовать /clr:pure, чтобы весь код был скомпилирован как управляемый или даже /clr:safe, чтобы сделать то же самое и также сделать его поддающимся проверке.

Любой код, который скомпилирован как управляемый, может принимать как родные, так и управляемые типы в качестве аргументов и возвращаемых значений. И этот код может находиться внутри управляемого типа, родного типа или свободной (глобальной) функции.

Смежные вопросы