/clr(公共语言运行时编译)

允许应用程序和组件使用公共语言运行时 (CLR) 中的功能并启用 C++/CLI 编译。

语法

/clr[:选项]

参数

options
以下一个或多个以逗号分隔的自变量。

  • 如果没有选项,/clr 会为组件创建元数据。 其他 CLR 应用程序可以使用该元数据,并且该组件也可以使用其他 CLR 组件的元数据中的类型和数据。 有关详细信息,请参阅混合(本机和托管)程序集

  • netcore

    从 Visual Studio 2019 版本 16.4 开始可用,/clr:netcore 使用最新的跨平台 .NET 框架(也称为 .NET Core)为组件创建元数据和代码。 元数据可由其他 .NET Core 应用程序使用。 而且,该选项使组件能够使用其他 .NET Core 组件的元数据中的类型和数据。

  • nostdlib

    指示编译器忽略默认 \clr 目录。 如果包含 DLL 的多个版本(如 System.dll),则编译器将产生错误。 此选项可指定编译过程中要使用的特定框架。

  • pure

    /clr:pure 已弃用。 在 Visual Studio 2017 及更高版本中,该选项已删除。 建议移植对 C# 来说必须是纯 MSIL 的代码。

  • safe

    /clr:safe 已弃用。 在 Visual Studio 2017 及更高版本中,该选项已删除。 建议移植对 C# 来说必须是安全 MSIL 的代码。

  • noAssembly

    /clr:noAssembly 已弃用。 改用 /LN(创建 MSIL 模块)

    命令编译器不要将程序集清单插入到输出文件中。 默认情况下,noAssembly 选项无效。

    清单中不具有程序集元数据的托管程序称为“模块”。 noAssembly 选项只能用于生成模块。 如果你使用 /c/clr:noAssembly 进行编译,则在链接器阶段指定 /NOASSEMBLY 选项以创建模块。

    在 Visual Studio 2005 之前,/clr:noAssembly 需要 /LD。 现在,指定 /clr:noAssembly 时即暗含 /LD

  • initialAppDomain

    initialAppDomain 已过时。 允许 C++/CLI 应用程序在 CLR 版本 1 上运行。 使用 initialAppDomain 编译的应用程序不应由使用 ASP.NET 的应用程序使用,因为它在 CLR 版本 1 中不受支持 。

备注

托管代码是可以由 CLR 检查和管理的代码。 托管代码可以访问托管对象。 有关更多信息,请参阅/clr 限制

有关如何用 C++ 开发定义和使用托管类型的应用程序的信息,请参阅 Component Extensions for Runtime Platforms

使用 /clr 编译的应用程序可以包含也可以不包含托管数据。

若要在托管应用程序上启用调试,请参阅/ASSEMBLYDEBUG(添加 DebuggableAttribute)

只有 CLR 类型会在垃圾回收堆上实例化。 有关更多信息,请参阅类和结构。 若要将函数编译为本机代码,请使用 unmanaged 杂注。 有关详细信息,请参阅 managedunmanaged

默认情况,/clr 是无效的。 当 /clr 有效时,/MD 也有效。 有关详细信息,请参阅 /MD/MT/LD(使用运行时库)/MD 确保从标准头文件中选择动态链接的多线程版本运行时例程。 托管编程必须进行多线程处理,因为 CLR 垃圾回收器将在辅助线程中运行终结器。

如果使用 /c 进行编译,则可以使用 /CLRIMAGETYPE 链接器选项指定生成的输出文件的 CLR 类型。

/clr 暗含 /EHa,且 /clr 不支持任何其他 /EH 选项。 有关详细信息,请参阅 /EH(异常处理模型)

有关如何确定文件的 CLR 映像类型的信息,请参阅/CLRHEADER

传递给链接器给定调用的所有模块都必须使用相同的运行时编译器选项(/MD/LD)进行编译。

使用 /ASSEMBLYRESOURCE 链接器选项以在程序集中嵌入资源。 /DELAYSIGN/KEYCONTAINER/KEYFILE 链接器选项还允许你自定义程序集的创建方式。

使用 /clr 时,_MANAGED 符号定义为 1。 有关详细信息,请参阅预定义宏

先初始化本机对象文件中的全局变量(如果可执行文件是 DLL,即在 DllMain 期间进行),再初始化托管部分的全局变量(在运行任何托管代码之前进行)。 #pragma init_seg 仅影响托管和非托管类别中的初始化顺序。

元数据和未命名类

未命名的类以 $UnnamedClass$<crc-of-current-file-name>$<index>$ 等名称出现在元数据中,其中 <index> 是编译中未命名类的顺序计数。 例如,下面的代码示例将在元数据中生成一个未命名类。

// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;

使用 ildasm.exe 查看元数据。

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 将“配置”下拉列表设置为“所有配置”,将“平台”下拉列表更改为“所有平台”。

  3. 选择“配置属性”>“C/C++”>“常规”页

  4. 修改“公共语言运行时支持”属性。 选择“确定”以保存更改 。

注意

在 Visual Studio IDE 中,可以在“属性页”对话框的“配置属性”>“C/C++”>“常规”页上单独设置 /clr 编译器选项。 但是,我们建议你使用 CLR 模板来创建你的项目。 它设置成功创建 CLR 组件所需的所有属性。 设置这些属性的另一种方法是使用“属性页”对话框的“配置属性”高级“高级”页上的“公共语言运行时支持”属性。> 此属性一次设置所有其他与 CLR 相关的工具选项。

以编程方式设置此编译器选项

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法