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日

相关文章

  • 利用JQuery直接调用asp.net后台的简单方法

    当使用 ASP.NET 进行 Web 开发时,常常需要通过 Ajax 技术实现与后台服务器的数据交互,实现无刷新或部分刷新的效果。JQuery 是一个流行的 JavaScript 库,它可以轻松地实现与后台 ASP.NET 及其他服务器端语言的交互。 下面是几个简单方法,利用 JQuery 直接调用 ASP.NET 后台程序以及如何从后台程序返回数据。 一、…

    C# 2023年6月3日
    00
  • .Net使用Cancellation Framework取消并行任务

    .Net使用Cancellation Framework取消并行任务的攻略 在编写并行代码时,我们通常会遇到需要取消一组任务的情况,为此 .Net 提供了一套名为 “Cancellation Framework” 的机制来进行任务取消管理。本文将详细介绍 .Net 的 Cancellation Framework 的使用方法,同时提供两个示例以帮助理解。 C…

    C# 2023年6月3日
    00
  • C#中的Task.WhenAll和Task.WhenAny方法介绍

    C#中的Task.WhenAll和Task.WhenAny方法介绍 在C#中,我们经常使用Task来进行异步编程,Task.WhenAll和Task.WhenAny则是Task API中的两个非常有用的方法。 Task.WhenAll Task.WhenAll方法接收一个Task列表,并在所有Task都执行完成后返回一个新的Task。这个新的Task为完成状…

    C# 2023年6月1日
    00
  • 使用HttpClient消费ASP.NET Web API服务案例

    以下是“使用HttpClient消费ASP.NET Web API服务案例”的完整攻略: 什么是HttpClient HttpClient是.NET Framework中的一个类,它提供了一组用于发送请求和接收HTTP应的方法。我们可以使用它来消费Web API服务。 消费Web API服务 以下是使用HttpClient消费ASP.NET Web API的…

    C# 2023年5月12日
    00
  • silverlight调用淘宝api接口做淘宝客应用

    Silverlight调用淘宝API接口做淘宝客应用 淘宝API是淘宝开放平台提供的一组Web API,可以让开发者通过API接口访问淘宝的商品、店铺、订单等信息。本文将介绍如何使用Silverlight调用淘宝API接口,实现一个简单的淘宝客应用。 1.注册淘宝开放平台应用 首先,我们需要在淘宝开放平台注册一个应用,以获取App Key和App Secre…

    C# 2023年5月15日
    00
  • C# Linq的Intersect()方法 – 返回两个序列的交集

    C# Linq Intersect()方法详解 Intersect()方法的定义 Intersect()方法是C# Linq方法之一,用于返回两个序列中共同出现的元素。该方法有两个重载版本,一个是无参数版本,返回两个序列中的重复元素,一个是带有另外一个序列作为参数的版本,返回两个序列中相同的元素。 无参数版本 无参数版本的Intersect()方法用于从两个…

    C# 2023年4月19日
    00
  • C# 8.0新特性介绍

    C# 8.0新特性介绍 C# 8.0是微软推出的最新版本的C#语言,带来了一些值得注意的新特性。本文将介绍C# 8.0的新特性以及如何使用它们。 Nullable引用类型 C# 8.0中引入了可空引用类型,这意味着我们可以声明“引用可能为空”的变量。现在,在声明引用类型变量时需要在类型名称后面添加一个“?”标记,这个标记使得编译器可以检测到我们对可空变量的操…

    C# 2023年6月1日
    00
  • asp.net core分块上传文件示例

    ASP.NET Core分块上传文件示例 在ASP.NET Core应用程序中,可以使用分块上传文件来上传大文件。在本文中,我们将介绍如何使用ASP.NET Core实现分块上传文件的完整步骤。 步骤一:创建前端页面 在使用ASP.NET Core实现分块上传文件之前,需要先创建前端页面。可以使用HTML和JavaScript创建前端页面。 <!DOC…

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