c检程序的公共语言运行时简称为,/clr(公共语言运行时编译) | Microsoft Docs

本文详细介绍了C++/CLI的公共语言运行时编译选项(/clr)及其各种参数,如/noAssembly、/nostdlib、/clr:netcore等。这些选项用于创建和管理元数据,使C++代码能够与.NET框架或.NET Core交互,支持混合编程和垃圾回收。同时,文章提到了编译器选项对多线程运行时库的影响以及与异常处理模型的关系。
摘要由CSDN通过智能技术生成

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

10/27/2020

本文内容

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

语法

/clr[:options]

参数

options

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

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

netcore

从 Visual Studio 2019 版本16.4 开始提供, /clr:netcore 使用最新的跨平台 .net framework (也称为 .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 。 /LD 当前在指定时是隐含的 /clr:noAssembly 。

initialAppDomain

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

备注

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

有关如何开发用于在 c + + 中定义和使用托管类型的应用程序的信息,请参阅 运行时平台的组件扩展。

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

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

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

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

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

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

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

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

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

元数据和未命名类

命名类出现在名称下的元数据中(例如 $UnnamedClass$$$ ),其中 是编译中未命名类的顺序计数。 例如,下面的代码示例将在元数据中生成一个未命名类。

// clr_unnamed_class.cpp

// compile by using: /clr /LD

class {} x;

使用 ildasm.exe 查看元数据。

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

将 配置 下拉列表设置为 " 所有配置",并将 " 平台 " 下拉列表设置为 " 所有平台"。

选择 "配置属性" " > c/c + +" " > 常规" 页。

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

备注

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

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

另请参阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值