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日

相关文章

  • IdentityServer4 QuckStart 授权与自定义Claims的问题

    下面我会详细讲解 IdentityServer4 QuckStart 授权与自定义Claims 的问题,并提供两条示例说明。 什么是 IdentityServer4 QuckStart? IdentityServer4 是一款基于 ASP.NET Core 的开源身份验证和授权服务器。通过 IdentityServer4,我们可以为我们的应用程序提供安全保护…

    C# 2023年6月3日
    00
  • c#多线程网络聊天程序代码分享(服务器端和客户端)

    C#多线程网络聊天程序代码分享(服务器端和客户端) 介绍 本文所分享的是使用C#编写的多线程网络聊天程序的源代码,包括服务器端和客户端代码。网络聊天程序可以实现在不同计算机之间进行即时聊天的功能,多线程可以提升程序的并发性和性能,同时使用C#编写可以大大简化代码编写过程。 实现流程 服务器端程序编写 服务器端程序的主要作用是接受用户请求,并与客户端进行通讯。…

    C# 2023年6月6日
    00
  • C#内置泛型委托之Action委托

    当我们在C#中需要定义一个不带参数且没有返回值的委托时,可以使用Action委托来实现。Action委托是一个内置的泛型委托,用于封装一个无参数且无返回值的方法。 Action委托的语法 下面是Action委托的语法: public delegate void Action(); public delegate void Action<in T>…

    C# 2023年6月1日
    00
  • C#中的==运算符用法讲解

    下面是关于“C#中的==运算符用法讲解”的完整攻略。 1. 介绍 ==运算符是用于比较两个值是否相等的运算符,可以用于比较数值、字符、字符串等类型的数据。在C#中,==运算符是值类型和引用类型的比较符。 2. 值类型比较 对于值类型,使用==运算符比较时,比较的是它们的值是否相等。 例如,以下示例代码演示了如何比较两个整数是否相等: int a = 1; i…

    C# 2023年5月15日
    00
  • C# 键值对数据排序代码

    下面我为大家详细讲解 “C# 键值对数据排序代码”的完整攻略: 1. Sort方法的基本使用 C#中的Dictionary是一个非泛型的键/值对集合,它使用哈希表来实现。由于哈希表的一个重要特性是元素的顺序无法保证,因此在某些情况下,我们可能需要像对List< T>那样对Dictionary进行排序。 Dictionary没有提供Sort或Sor…

    C# 2023年6月8日
    00
  • .NET Core剪裁器背后的技术及工作原理介绍

    在本攻略中,我们将详细讲解.NET Core剪裁器的技术及工作原理,并提供两个示例说明。 什么是.NET Core剪裁器? .NET Core剪裁器是一种工具,可以将.NET Core应用程序中未使用的代码和依赖项从应用程序中删除,从而减小应用程序的大小。剪裁器可以根据应用程序的需求,自动删除不需要的代码和依赖项,从而减小应用程序的大小。 剪裁器的工作原理 …

    C# 2023年5月16日
    00
  • asp.net(c#)Enterprise Library 3.0 下载

    关于asp.net(c#)Enterprise Library 3.0下载的完整攻略,可以分成以下几个步骤: 1. 打开Enteprise Library官网页面 首先需要打开Enteprise Library官网页面,官网地址为:https://github.com/MicrosoftArchive/enterprise-library-downloads…

    C# 2023年6月3日
    00
  • C#中SQL参数传入空值报错解决方案

    我们先从问题的背景说起:在使用C#编写带参数的SQL查询时,如果参数的值为null或者DBNull.Value,会出现“System.ArgumentNullException: Value cannot be null”的异常。接下来,我将介绍几种解决方案来避免这个问题。 方案一:使用IFNULL()函数 在SQL语句中使用IFNULL()函数可以在参数值…

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