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

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

语法

/clr[:options]

参数

options
以下一个或多个逗号分隔参数。

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

  • netcore

    从 2019 Visual Studio版本 16.4 开始提供,使用最新的跨平台 .NET 框架(也称为 .NET Core)为组件创建元数据和 /clr:netcore 代码。 其他 .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/LD 现在,指定 时隐含 /clr:noAssembly

  • initialAppDomain

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

备注

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

若要了解如何开发在 C++ 中定义和使用托管类型的应用程序,请参阅运行时 平台的组件扩展

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

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

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

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

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

/clr 表示 /EHa ,并且 不支持 /EH 任何其他选项 /clr 。 有关详细信息,请参阅异常 /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 中,可以在"属性页"对话框的"配置属性 /clr > C/C++ 常规"页上 > 单独设置编译器选项。 但是,建议使用 CLR 模板来创建项目。 它设置成功创建 CLR 组件所需的所有属性。 设置这些属性的另一种方式是使用"属性页"对话框的"配置 属性""高级"页上的"公共语言运行时 > 支持"属性。 此属性同时设置所有其他与 CLR 相关的工具选项。

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

另请参阅

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