C ++ / CLI: Почему в этом сценарии ›неуправляемый переход на неуправляемый?

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

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


person dario_ramos    schedule 27.06.2011    source источник


Ответы (2)


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

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

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

// Your ref classes here
// ...

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

person Hans Passant    schedule 27.06.2011

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

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

person ildjarn    schedule 27.06.2011