/clr(公共语言运行时编译)
使应用程序和组件能够使用公共语言运行时 (CLR) 中的功能。
/clr[:options]
参数
options
以下一个或多个选项,以逗号分隔。/clr
创建应用程序的元数据。元数据可由其他 CLR 应用程序使用,并允许该应用程序使用其他 CLR 组件的元数据中的类型和数据。有关更多信息,请参见
/clr:pure
生成 Microsoft 中间语言 (MSIL) - 只有不具有本机可执行代码的输出文件。但是,它可以包含编译为 MSIL 的本机类型。有关更多信息,请参见 纯代码和可验证代码 (C++/CLI)。
/clr:safe
生成仅包含 MSIL(无本机可执行代码)且可验证的输出文件。/clr:safe 启用验证诊断(PEVerify 工具 (Peverify.exe))。有关更多信息,请参见 Writing Verifiably Type-Safe Code。
/clr:oldSyntax
针对 C++ 语法(CLR 编程的原始 Visual C++ 语法)启用托管扩展。C++ 托管扩展语法已弃用。只有在维护使用 C++ 托管扩展的应用程序时,才使用 /clr:oldSyntax。如果要开发新应用程序,请使用更新的语法。有关更多信息,请参见适用于运行时平台的组件扩展。
如果具有 C++ 托管扩展应用程序,可以升级项目以使用新语法。有关更多信息,请参见 迁移和升级程序。
/clr:noAssembly
指定程序集清单不应插入到输出文件中。默认情况下,noAssembly 选项不起作用。noAssembly 选项已弃用。请改用 /LN(创建 MSIL 模块)。有关更多信息,请参见 Deprecated Compiler Options。
清单中不包含程序集元数据的托管程序称为“模块”。noAssembly 选项只可用于生成模块。如果使用 /c 和 /clr:noAssembly 进行编译,那么,指定链接器阶段中的 /NOASSEMBLY 选项来创建模块。
在 Visual C++ 2005 之前,/clr:noAssembly 表示 /clr。但是,现在 /clr 还支持 /clr:oldSyntax,因此必须在指定 /clr:noAssembly 时指定一个 /clr 形式。例如,/clr:noAssembly /clr 使用新的 Visual C++ CLR 语法创建模块,而 /clr:noAssembly,oldSyntax 使用 C++ 托管扩展创建模块。
在 Visual C++ 2005 之前,/clr:noAssembly 需要 /LD。现在 /LD 通过指定 /clr:noAssembly 来表示。
/clr:initialAppDomain
使 Visual C++ 应用程序在 CLR 版本 1 上运行。如果使用 initialAppDomain,那么可能会看到一些在 Microsoft 支持网站上的 BUG: AppDomainUnloaded exception when you use managed extensions for Visual C++ components(BUG:在使用 Visual C++ 的组件托管扩展时的 AppDomainUnloaded 异常)中讨论的问题。使用 ASP.NET 的应用程序不应使用 initialAppDomain 编译的应用程序,因为它不受 CLR 版本 1 的支持。
/clr:nostdlib
指示编译器忽略默认 \clr 目录。如果您正包含 DLL 的多个版本(如 System.dll),则编译器将产生错误。使用此选项允许您指定要在编译期间使用的特定框架。
备注
托管代码是可由 CLR 检查和管理的代码。托管代码可以访问托管对象。有关更多信息,请参见 /clr 限制。
有关如何开发定义和使用托管类型的应用程序的信息,请参见适用于运行时平台的组件扩展。
使用 /clr 编译的应用程序可能包含托管数据,也可能不包含托管数据。
若要允许在托管应用程序中进行调试,请参见 /ASSEMBLYDEBUG(添加 DebuggableAttribute)。
只有 CLR 类型将在垃圾回收堆中进行实例化。有关更多信息,请参见 类和结构(C++ 组件扩展)。若要将函数编译为本机代码,请使用 unmanaged 杂注。有关更多信息,请参见 managed, unmanaged。
默认情况下,/clr 不生效。/clr 有效时,/MD 也有效。有关更多信息,请参见 /MD、/MT、/LD(使用运行库)。/MD 确保从标准头 (.h) 文件中选择运行时例程的动态链接的多线程版本。多线程处理是托管编程所必需的,其中一部分原因是 CLR 垃圾回收器将在辅助线程中运行终结器。
如果使用 /c 进行编译,则可以使用 /CLRIMAGETYPE 指定生成的输出文件的 CLR 类型(IJW 类型、安全类型或纯类型)。
/clr 暗指 /EHa,其他 /EH 选项不受 /clr 支持。有关更多信息,请参见 /EH(异常处理模型)。
有关如何确定文件的 CLR 映像类型的信息,请参见 /CLRHEADER。
传递给链接器的给定调用的所有模块都必须使用相同的运行库编译器选项(/MD 或 /LD)进行编译。
使用 /ASSEMBLYRESOURCE 链接器选项在程序集中嵌入资源。/DELAYSIGN、/KEYCONTAINER 和 /KEYFILE 链接器选项也可用于自定义程序集的创建方式。
使用 /clr 时,_MANAGED 符号定义为 1。有关更多信息,请参见预定义的宏。
首先将初始化本机对象文件中的全局变量(如果可执行文件为 DLL,则在 DllMain 期间),然后将初始化托管部分中的全局变量(在运行任何托管代码之前)。#pragmainit_seg 只影响托管和非托管类别中的初始化顺序。
使用 /clr:safe 进行编译类似于使用如 C# 等语言中的 /platform:anycpu 进行编译。
安全映像和纯映像
纯映像将使用 C 运行库的 CLR 版本。但是,CRT 无法验证,因此使用 /clr:safe 进行编译时不能使用 CRT。有关更多信息,请参见 CRT库功能。
不能出现在纯映像中的本机代码的示例包括内联程序集、setjmp 和 longjmp。
纯映像或安全映像的每个入口点都被托管。当通过使用 /clr 进行编译时,入口点是本机入口点。有关更多信息,请参见 __clrcall。
当通过使用 /clr:safe 进行编译时,变量默认为 appdomain,而不能是基于每个进程的。对于**/clr:pure**,尽管 appdomain 为默认,但可以使用 process 变量。
在 64 位操作系统中运行使用 /clr 或 /clr:pure 编译的 32 位 .exe 文件时,应用程序将在 WOW64 下运行,WOW64 允许在 64 位操作系统中由 32 位 CLR 运行 32 位应用程序。默认情况下,使用 /clr:safe 编译的 .exe 文件将在运行 64 位操作系统的计算机的 64 位 CLR 上运行。(在 32 位操作系统上,同一个 .exe 文件将在 32 位 CLR 上运行。)但是,安全应用程序可以加载 32 位组件。在这种情况下,当安全映像加载 32 位应用程序时,在操作系统的 64 位支持下运行的安全映像将会失败 (BadFormatException)。若要确保安全映像在 64 位操作系统中加载 32 位映像时继续运行,必须使用 /CLRIMAGETYPE 更改元数据 (.corflags),将其标记为在 WOW64 下运行。.下面的命令行是一个示例。(替代您自己的输入符号。)
cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console
有关如何获取修饰名的信息,请参见使用列表查看修饰名。有关 64 位编程的更多信息,请参见 64 位配置的程序 (Visual C++)。
有关示例、演练及更多信息,请参见:
元数据和未命名类
未命名类将显示在名称形式如下的元数据中:$UnnamedClass$当前文件名的 crc$索引$,其中“索引”是未命名类在编译中的顺序号。例如,下列代码示例将在元数据中生成未命名类。
// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;
使用 ildasm.exe 查看元数据。
在 Visual Studio 中设置此编译器选项
在**“解决方案资源管理器”中,右击项目名称,然后点击“属性”以打开项目“属性页”**对话框。
选择**“配置属性”**文件夹。
在**“常规”属性页上,修改“公共语言运行时支持”**属性。
说明 在“属性页”对话框中启用 /clr 后,与 /clr 不兼容的编译器选项属性也将根据需要进行调整。例如,如果设置 /RTC,然后启用 /clr,/RTC 将被关闭。
另外,调试 /clr 应用程序时,“调试器类型”属性应设置为“混合”或“仅限托管”。有关更多信息,请参见 C++ 调试配置的项目设置。
有关如何创建模块的信息,请参见 /NOASSEMBLY(创建 MSIL 模块)。
以编程方式设置此编译器选项
- 请参见 CompileAsManaged。