假设我有一个使用/ clr开关编译的C ++ / CLI程序集。在该程序集中,有一些托管类调用在同一程序集中定义的非托管(普通C ++)类。当您使用Visual Studio进行调试,并查看调用堆栈时,它会显示Managed-> Unmanaged和Unmanaged-> Managed转换的位置。
那么,引起我注意的是:当其中一个托管类调用同一个程序集中的一个非托管类时,为什么没有托管/非托管转换?这些非托管类是否会在幕后变成托管类?
答案 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任何包含非托管代码声明的标头,你也需要这个。