将项目从混合模式转换为纯中间语言项目

默认情况下,所有 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:

将混合模式应用程序转换为纯中间语言

  1. 删除 C 运行时库 (CRT) 的链接:

    1. 在定义应用程序入口点的 .cpp 文件中,将入口点更改为 Main()。 使用 Main() 指示项目未链接到 CRT。

    2. 在解决方案资源管理器中,右键单击项目,然后在快捷菜单上选择“属性”以打开应用程序的属性页。

    3. 在链接器的“高级”项目属性页中,选择“入口点”,然后在此字段中输入“Main”。

    4. 对于控制台应用程序,在链接器的“系统”项目属性页中,选择“SubSystem”字段并将其更改为 Console (/SUBSYSTEM:CONSOLE)

      注意

      无需为 Windows 窗体应用程序设置此属性,因为子系统字段默认设置为 Windows (/SUBSYSTEM:WINDOWS)

    5. stdafx.h 中,注释掉所有 #include 语句。 例如,在控制台应用程序中:

      // #include <iostream>
      // #include <tchar.h>
      

      - 或者 -

      例如,在 Windows 窗体应用程序中:

      // #include <stdlib.h>
      // #include <malloc.h>
      // #include <memory.h>
      // #include <tchar.h>
      
    6. 对于 Windows 窗体应用程序,请在 Form1.cpp 中注释掉引用 #includewindows.h 语句。 例如:

      // #include <windows.h>
      
  2. 将下列代码添加到 stdafx.h

    #ifndef __FLTUSED__
    #define __FLTUSED__
       extern "C" __declspec(selectany) int _fltused=1;
    #endif
    
  3. 删除所有非托管类型:

    在适当情况下,将非托管类型替换为引用 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 返回类型。