C ++ / CLI: почему в этом сценарии нет перехода Managed-> Unmanaged? - PullRequest
1 голос
/ 27 июня 2011

Допустим, у меня есть сборка C ++ / CLI, скомпилированная с ключом / clr. В этой сборке есть управляемые классы, которые вызывают неуправляемые классы (обычный C ++), определенные в той же сборке. Когда вы отлаживаете с помощью Visual Studio и смотрите на стек вызовов, он показывает, где происходят переходы Managed-> Unmanaged и Unmanaged-> Managed.

Итак, что привлекло мое внимание: почему не происходит управляемый / неуправляемый переход, когда один из управляемых классов вызывает один из неуправляемых классов из той же сборки? Эти неуправляемые классы каким-то образом превращаются в управляемые классы за кулисами?

Ответы [ 2 ]

4 голосов
/ 27 июня 2011

Возможно, потому что вы не сказали компилятору, что хотите, чтобы «неуправляемый код» компилировался в машинный код.При использовании / clr весь код компилируется в IL.У него нет проблем со стандартным кодом C ++, есть только несколько языковых конструкций, которые не поддерживаются.

Если вы смешали код в файле исходного кода, тогда вы можете использовать #pragma для переключения:

#pragma managed(push, off)
// Unmanaged code here
// ...
#pragma managed(pop)

// Your ref classes here
// ...

Это понадобится и вам, если вы #include заголовки, содержащие объявления неуправляемого кода.

4 голосов
/ 27 июня 2011

Они не скомпилированы как управляемые типы, но они скомпилированы в IL, а не в собственный нативный код, если исходные файлы, в которых они определены, скомпилированы с /clr и нет #pragma unmanaged или #pragma managed (off). .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...