默认情况下,所有 Visual C++ CLR 项目都链接到 C 运行时库。 因此,这些项目被归类为混合模式应用程序,因为它们结合了本机代码和面向公共语言运行时的代码(托管代码)。 编译后,它们会编译为中间语言 (IL) ,也称为 Microsoft 中间语言 (MSIL)。
重要
Visual Studio 2015 已弃用,Visual Studio 2017 不再支持为 CLR 应用程序创建 /clr:pure
或 /clr:safe
代码。 如果需要纯程序集或安全程序集,建议将应用程序转换为 C#。
如果使用支持的 /clr:pure
或 /clr:safe
的 Microsoft C++ 编译器工具集的早期版本,可以通过此过程将代码转换为纯 MSIL:
将混合模式应用程序转换为纯中间语言
删除 C 运行时库 (CRT) 的链接:
在定义应用程序入口点的 .cpp 文件中,将入口点更改为
Main()
。 使用Main()
指示项目未链接到 CRT。在解决方案资源管理器中,右键单击项目,然后在快捷菜单上选择“属性”以打开应用程序的属性页。
在链接器的“高级”项目属性页中,选择“入口点”,然后在此字段中输入“Main”。
对于控制台应用程序,在链接器的“系统”项目属性页中,选择“SubSystem”字段并将其更改为 。
Console (/SUBSYSTEM:CONSOLE)
注意
无需为 Windows 窗体应用程序设置此属性,因为子系统字段默认设置为
Windows (/SUBSYSTEM:WINDOWS)
。在
stdafx.h
中,注释掉所有#include
语句。 例如,在控制台应用程序中:// #include <iostream> // #include <tchar.h>
- 或者 -
例如,在 Windows 窗体应用程序中:
// #include <stdlib.h> // #include <malloc.h> // #include <memory.h> // #include <tchar.h>
对于 Windows 窗体应用程序,请在
Form1.cpp
中注释掉引用#include
的windows.h
语句。 例如:// #include <windows.h>
将下列代码添加到
stdafx.h
:#ifndef __FLTUSED__ #define __FLTUSED__ extern "C" __declspec(selectany) int _fltused=1; #endif
删除所有非托管类型:
在适当情况下,将非托管类型替换为引用
System
命名空间中的结构。 下表列出了常见的托管类型:结构 说明 Boolean
表示布尔值。 Byte
表示一个 8 位无符号整数。 Char
表示一个 Unicode 字符。 DateTime
表示某个时刻,通常以日期和当天的时间表示。 Decimal
表示十进制数。 Double
表示一个双精度浮点数。 Guid
表示全局唯一标识符 (GUID)。 Int16
表示 16 位有符号整数。 Int32
表示 32 位带符号整数。 Int64
表示 64 位有符号整数。 IntPtr
用于表示指针或句柄的平台特定类型。 SByte
表示 8 位有符号整数。 Single
表示一个单精度浮点数。 TimeSpan
表示一个时间间隔。 UInt16
表示 16 位无符号整数。 UInt32
表示 32 位无符号整数。 UInt64
表示 64 位无符号整数。 UIntPtr
用于表示指针或句柄的平台特定类型。 Void
指示不返回值的方法;也就是说,该方法具有 void
返回类型。