C ++ / CLI:为什么在这种情况下没有Managed-> Unmanaged转换?

时间:2011-06-27 19:18:00

标签: c++ c++-cli unmanaged transition managed

假设我有一个使用/ clr开关编译的C ++ / CLI程序集。在该程序集中,有一些托管类调用在同一程序集中定义的非托管(普通C ++)类。当您使用Visual Studio进行调试,并查看调用堆栈时,它会显示Managed-> Unmanaged和Unmanaged-> Managed转换的位置。

那么,引起我注意的是:当其中一个托管类调用同一个程序集中的一个非托管类时,为什么没有托管/非托管转换?这些非托管类是否会在幕后变成托管类?

2 个答案:

答案 0 :(得分:4)

它们不是作为托管类型编译的,但是如果它们定义的源文件是使用/clr而不是#pragma unmanaged或{编译的,那么它们将被编译为IL而不是正确的本机代码{1}}存在。

就个人而言,我很少使用#pragma managed (off)编译整个项目,而只是在需要它的特定源文件上使用/clr,因此非托管类型和函数会被编译为正确的本机代码。 / p>

答案 1 :(得分:4)

可能是因为您没有告诉编译器您希望将“非托管代码”编译为机器代码。如果/ clr生效,所有代码都会编译为IL。它对标准C ++代码没有任何问题,只有少数语言结构不受支持。

如果您在源代码文件中混合了代码,那么您可以使用#pragma切换:

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

// Your ref classes here
// ...

如果#include任何包含非托管代码声明的标头,你也需要这个。