VC++ 属于托管还是非托管类别?

Posted

技术标签:

【中文标题】VC++ 属于托管还是非托管类别?【英文标题】:VC++ belongs to Managed or unmanaged category? 【发布时间】:2012-04-13 08:34:09 【问题描述】:

在阅读了一些关于托管和非托管代码的资料后,我意识到托管编译器会生成 IL,任何机器都可以理解。我们需要做的只是将程序集部署在任何其他机器上,CLR 会帮助它正确运行。

但是,我还读到 VC++ 不支持 CLR 及其非托管代码。但是我们可以在任何机器上运行 VC++ 二进制文件而无需任何修改。它不需要与我们构建 exe 的机器具有相同的配置。

请澄清非托管代码和托管代码到底是什么?如果非托管代码不应该在任何其他配置很少不同的机器上运行,比如不同的主板、芯片组等...... VC++ 二进制文件如何在那里运行?

【问题讨论】:

【参考方案1】:

未经任何修改,您无法在任何机器上运行 VC++ 二进制文件。您只能在 Windows 机器上运行它,甚至不能在任何机器上运行它。例如,当前的 VC++ 64 位可执行文件将无法在旧版 Win 95 下运行。

托管代码是转换为 IL 的代码,由 CLR 在运行时解释。非托管代码是将代码转换为native机器码,由CPU直接运行。

【讨论】:

要运行 .net exe,我们需要 .net 框架在其他机器上运行。 VC++ MFC exe不是这样吗? @LLL 是的,但是“其他机器”!=“其他平台”。例如,您不能在 UNIX 机器上运行 windows EXE(至少不能没有模拟器)。您不需要具有相同的配置,但您需要具有相同的平台(即:相同的操作系统和架构)。 我们可以在unix中运行.net exe吗?如果可以的话它是如何工作的?CLR会默认安装在unix中?, @LLL 你需要为几乎所有情况安装一些东西。对于用 Visual C++ 编写的程序,通常需要 VC++ Runtime。如果您使用 MFC,则还需要 mfc dll。如果为 .net 编译(使用 C++/CLI 作为语言),则需要 .net 运行时。这一切都只适用于 Windows 操作系统 - 除了一些 .NET 程序(再次使用 C++/CLI)可以在支持它的所有平台上运行单声道。 @LLL CLR 默认情况下未安装在 unix 上。您需要为此安装单声道,并且您必须确保使用 CLR 的 /clr:pure 编译器开关编译您的代码。但是,您在使用 C++/CLI 可以执行的操作方面受到限制。【参考方案2】:

通常 VC++ 会生成非托管二进制文件。它们可以在所有 Windows 计算机上运行(可能使用 c++-redist 包)。

要使用 c++ 创建托管 (.NET) 应用程序,您需要使用 C++/CLI。

在这种情况下,托管代码是 .NET,非托管代码是本机二进制文件。

要运行非托管二进制文件,您需要机器上的依赖库,要运行托管代码,您需要 .NET Framework。

【讨论】:

【参考方案3】:

Visual C++ 不是一种语言,它是 microsoft 的 IDE,带有一个编译器和一组库。您可以使用此编译器生成托管或非托管代码。如果是非托管代码,它将生成 Windows 可以理解的格式的 exe(或 dll 或其他二进制文件)。操作系统(在本例中为 Windows)从您那里抽象出所有其他细节,例如处理器、主板等。

【讨论】:

实际上 - Visual Studio 是 IDE,Visual C++ 是编译器和运行时,C++ 是语言。

以上是关于VC++ 属于托管还是非托管类别?的主要内容,如果未能解决你的问题,请参考以下文章

如何识别项目是托管 c++ 项目还是非托管 c++ 项目

这个 DLL 是托管的还是非托管的?

托管和非托管 C++/MFC 可以混合在一个 dll 中吗?

检查非托管 DLL 是 32 位还是 64 位?

检查非托管 DLL 是 32 位还是 64 位?

c# 托管与非托管