CPF 使用C#的Native AOT 发布程序的详细过程

一、什么是 Native AOT

C#语言中,通常使用JIT进行运行时编译以提升程序性能,但AOT(Ahead of Time)则是在编译时将C#代码编译成本地代码,运行时无需JIT,直接执行本地代码,从而提高了程序的启动速度和执行效率。同时,通过Native AOT可生成单独的可执行文件,无需安装.NET运行时环境。

二、如何使用 Native AOT 发布程序

步骤如下:

1.安装 .NET 5.0 SDK

Native AOT是.NET 5.0的一个新功能,因此需要安装.NET 5.0 SDK。

2.安装 C++ 工具链

在Windows上,可以安装Visual Studio 2019,选择C++桌面开发,之后选择安装即可。或者可以单独下载安装Visual C++ Build Tools。

3.创建 .NET 5.0 项目

使用Visual Studio 2019或.NET CLI创建一个.NET 5.0项目。

4.安装 System.Runtime.CompilerServices.Unsafe NuGet 包

NuGet包中包含一些unsafe的API,使用Native AOT发布需要使用。

5.安装 Microsoft.DotNet.ILCompiler NuGet 包

该NuGet包是 .NET Core Runtime 单独发布模式(Single-file)所依赖的 package,提供了 IL 前端、优化器和 Win32 和 ARM64 的代码生成器。

安装完成后,需要在项目的*.csproj文件中添加以下配置:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <OutputPath>$(OutputPath)$(AssemblyName).exe</OutputPath>
  <AssemblyName>MyAOTProgram</AssemblyName>
  <TargetFramework>net5.0</TargetFramework>
  <PublishSingleFile>true</PublishSingleFile>
  <PublishTrimmed>true</PublishTrimmed>
  <SelfContained>true</SelfContained>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

其中:

• OutputType:定义输出文件的类型为Exe可执行程序。

• OutputPath:定义输出路径,将程序输出命名为MyAOTProgram。

• TargetFramework:定义项目的目标框架。

• PublishSingleFile:生成单独的可执行文件。

• PublishTrimmed:在发布之前进行瘦身操作,删除未使用的代码和依赖项。

• SelfContained:发布时将框架和运行时打包到输出文件中。

• RuntimeIdentifier:定义发布的目标平台,这里选择win-x64。

6.执行 dotnet publish 命令

在命令行中进入项目根目录,执行以下命令:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

一段时间之后,即可获得一个单一可执行文件的发布版本。

三、示例说明

我将用两个示例来说明Native AOT的使用。

第一个示例:计算圆的周长和面积

我们首先创建一个控制台应用程序,并添加一个名为Circle的类。

public class Circle
{
    private const double PI = 3.14;
    public double Radius { get; set; }
    public double GetArea()
    {
        return PI * Radius * Radius;
    }
    public double GetCircumference()
    {
        return 2 * PI * Radius;
    }
}

然后,我们编写一个控制台应用程序来测试这个类:

static void Main(string[] args)
{
    Console.WriteLine("请输入圆的半径:");
    var rStr = Console.ReadLine();
    if (double.TryParse(rStr, out var radius))
    {
        var circle = new Circle { Radius = radius };
        Console.WriteLine($"圆的周长:{circle.GetCircumference():F2}");
        Console.WriteLine($"圆的面积:{circle.GetArea():F2}");
    }
    else
    {
        Console.WriteLine("输入的不是有效的数字。");
    }
}

我们需要在此基础上进行修改,添加 Native AOT 的相关配置。

首先,在 Circle.csproj 文件中添加以下内容:

<ItemGroup>
  <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="6.0.0-preview.7.21377.19" />
  <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0-preview.7.21377.19" />
</ItemGroup>

<PropertyGroup>
  <PublishSingleFile>true</PublishSingleFile>
  <PublishTrimmed>true</PublishTrimmed>
  <SelfContained>true</SelfContained>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  <UseAppHost>true</UseAppHost>
  <AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>

<ItemGroup>
  <Function Include="**\*func*.cs" />
</ItemGroup>

其中,需要注意的是:

• ILCompiler和System.Runtime.CompilerServices.Unsafe是Native AOT所必须的NuGet包,我们添加了这两个NuGet包的引用。

• 其余项是Native AOT项目的常规配置。

然后,在Circle.cs中的 main 方法中,把控制台输出的改成return方式,即:

static double[] Main(string[] args)
{
    var result = new double[2];
    Console.WriteLine("请输入圆的半径:");
    var rStr = Console.ReadLine();
    if (double.TryParse(rStr, out var radius))
    {
        var circle = new Circle { Radius = radius };
        result[0] = circle.GetCircumference();
        result[1] = circle.GetArea();
    }

    return result;
}

我们需要把输出从控制台改成返回一个double类型数组,第一个元素表示周长,第二个元素表示面积。

最后执行以下命令进行发布:

dotnet publish -c release -r win-x64 /p:PublishSingleFile=true

发布完成后,会在bin\Release\net5.0\win-x64\publish下面生成名为Circle.exe的可执行文件。双击运行可看到控制台输出的内容。

第二个示例:使用 Native AOT 运行 web 应用程序

我们使用.NET Core Web应用程序,进行一下操作:

1.使用 Visual Studio 2019 创建一个 ASP.NET Core 项目。

2.修改 Program.cs 中的 CreateHostBuilder 方法,添加以下代码:

builder.UseConfiguration(config);
builder.UseStartup<Startup>();
builder.UseUrls("http://*:5000");
builder.UseKestrel(options =>
{
    options.Listen(IPAddress.Any, 5000);
});

使用AOT发布时,需要将应用程序绑定到固定的IP地址(IPAddress.Any),并且监听端口必须为5000。

3.在项目根目录下创建 appsettings.json 文件,添加数据库连接字符串:

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=localhost;Initial Catalog=webapp;Persist Security Info=True;User ID=****;Password=****"
  }
}

4.使用 Entity Framework 创建 MySQL 数据库:

4.1 安装 Pomelo.EntityFrameworkCore.MySql NuGet 包。

4.2 修改 appsettings.json 文件,添加 MySQL 连接字符串。

4.3 创建一个名为 “Blog” 的类:

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

4.4 修改 Program.cs 文件,添加以下代码:

// 使用 MySQL 数据库
services.AddDbContext<BlogContext>(options =>
    options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

4.5 使用 Migration 添加 Blog 表:

dotnet ef migrations add InitialCreate
dotnet ef database update

至此,我们已经成功创建并配置了一个带有 MySQL 数据库连接的 ASP.NET Core 项目,接下来我们将使用 Native AOT 发布它。

修改 *.csproj 文件,配置如下:

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <OutputType>Exe</OutputType>
        <SelfContained>true</SelfContained>
        <PublishTrimmed>true</PublishTrimmed>
        <AssemblyName>WebApp</AssemblyName>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.App" />
        <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.2" />
    </ItemGroup>

</Project>

执行以下命令进行发布:

dotnet publish -c release -r win-x64 /p:PublishSingleFile=true /p:PublishTrimmed=true

发布完成后,会在bin\Release\net5.0\win-x64\publish下面生成名为WebApp.exe的可执行文件。

运行WebApp.exe,打开浏览器,输入http://localhost:5000/ 即可查看应用程序的页面。

以上就是 Native AOT 发布程序的详细过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CPF 使用C#的Native AOT 发布程序的详细过程 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C# Linq的Concat()方法 – 连接两个序列

    下面是对于C# Linq的Concat()方法的详细讲解。 方法介绍 Concat()方法可以将两个序列拼接成一个新序列,该新序列包含了原始序列的所有元素。该方法返回值是一个新序列,这个新序列包含了原来两个序列中的所有元素。 下面是该方法的语法: public static System.Collections.Generic.IEnumerable<…

    C# 2023年4月19日
    00
  • C#调用百度API实现活体检测的方法

    C#调用百度API实现活体检测是一个可以应用在人脸识别等领域的重要技术。本攻略将会介绍如何使用百度AI开发平台的活体检测API,并给出两个详细的示例。 步骤一:注册百度AI开发平台 在使用百度API前,需要先注册百度AI开发平台账号,完成OAuth2.0认证。 打开百度AI开发平台首页,点击右上角“注册”按钮,创建账号。 登录账号后,进入“控制台”页面,在“…

    C# 2023年5月31日
    00
  • C#位运算以及实例计算详解

    C#位运算以及实例计算详解 什么是位运算 位运算是指针对二进制数按位进行操作的运算,它可以高效地实现各种算法和操作。 C#中支持以下位运算符: 按位与(&) 按位或(|) 按位异或(^) 按位取反(~) 左移(<<) 右移(>>) 位运算的应用 位运算可以应用于许多领域,特别是在开发中经常用到的领域有: 位掩码:使用一个数(掩…

    C# 2023年5月31日
    00
  • 详解ASP.NET Razor 语法

    ASP.NET Razor 是一种基于类 HTML 文件的标记语言,它以简单、清晰和易于使用而闻名。本攻略将详细讲解 Razor 语法,以帮助开发人员理解和使用 Razor。 Razor基础 变量 Razor 可以使用 @ 符号来定义变量,比如: @{ var message = "Hello World!"; } 定义完变量之后,就可以…

    C# 2023年5月31日
    00
  • ASP.NET Core管理应用程序状态

    ASP.NET Core管理应用程序状态攻略 ASP.NET Core是一个跨平台的开源Web框架,它提供了一种灵活的方式来管理应用程序状态。本攻略将详细介绍如何在ASP.NET Core中管理应用程序状态,并提供两个示例说明。 状态管理 在ASP.NET Core中,状态管理是指跟踪应用程序的状态,以便在不同的请求之间共享数据。ASP.NET Core提供…

    C# 2023年5月16日
    00
  • C#中实现线程同步lock关键字的用法详解

    下面是“C#中实现线程同步lock关键字的用法详解”的完整攻略。 1. 什么是线程同步 线程同步是指不同线程之间按照一定的顺序执行,避免线程之间的竞争和混乱。在多线程编程中,线程同步非常重要。C# 中的 lock 关键字可以用来实现线程同步。 2. lock关键字的语法 lock 关键字用于保护一个代码快,以确保只有一个线程可以访问它。lock 关键字必须使…

    C# 2023年6月7日
    00
  • 在.NET中使用Newtonsoft.Json转换,读取,写入的方法介绍

    为了让大家更好地了解在.NET中如何使用Newtonsoft.Json转换、读取和写入JSON数据,下面为大家详细介绍这方面的攻略: 简介 Newtonsoft.Json是.NET框架下一个非常流行的用于JSON序列化和反序列化的库。它可以让我们方便地将.NET对象序列化成JSON格式的字符串,以及将JSON格式的字符串反序列化成.NET对象。在.NET开发…

    C# 2023年5月31日
    00
  • C# BinaryReader.Close – 关闭二进制读取器

    C#中的BinaryReader类是一个自.NET Framework 1.1版本引入的类,用于从二进制流中读取基本数据类型。该类有一个Close方法,本文将详细讲解该方法的作用和使用方法。 关于BinaryReader.Close方法的作用 BinaryReader.Close方法用于关闭BinaryReader对象读取的流。当对象读取完成后,应该尽快关闭…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部