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

yizhihongxing

一、什么是 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日

相关文章

  • .Net 自定义转换器JsonConverter的使用详解

    .Net 自定义转换器JsonConverter的使用详解 什么是JsonConverter JsonConverter 是Json.NET 库中的一个抽象类,它是一个非常强大和灵活的工具,用于将一个类型的实例转换为 JSON 自定义结构。你可以使用 JsonConverter 来处理各种情况,例如类型转换、数据格式转换、时间日期转换等等,以满足你的特殊需求…

    C# 2023年5月31日
    00
  • C#实现的海盗分金算法实例

    C#实现的海盗分金算法实例,是一种常见的分配问题解决方法,以下是详细的攻略过程: 什么是海盗分金算法? 海盗分金算法,也称为“海盗分赃金问题”,是一种常见的分配问题解决方法。故事背景是这样的:若干个海盗合作得到了一批金子,他们需要分配这批金子。其中,每个海盗都可以提出一个分配方案(包括他自己分到多少金子),其他人可以赞成或反对。如果超过一半的海盗同意,那么分…

    C# 2023年6月7日
    00
  • AspNetCoreRateLimit应用于MVC项目求助

    AspNetCoreRateLimit应用于MVC项目求助 前言 之前发过一篇文章: .NET Core WebApi接口ip限流实践 – 妙妙屋(zy) – 博客园 (cnblogs.com) 然后应用在前后端分离项目这个组件是非常好用的。但应用于不分离的项目,比如我的个人博客就有点麻烦。 就是我的需求是评论接口限流,然后触发限流后要回到文章页面告诉用户你…

    C# 2023年5月8日
    00
  • c#委托详解和和示例分享

    C#委托详解 什么是委托 在C#语言中,委托是指向一个或多个方法的引用,它允许执行方法的实例动态绑定到一个委托变量上。简单理解委托,可以将它视为让我们能够以一种更加灵活的方式处理方法的一种方式。在C#中,委托类属于System命名空间下。 委托的定义 委托的定义语法为: delegate <return type> <delegate na…

    C# 2023年5月15日
    00
  • WPF的数据绑定详细介绍

    WPF的数据绑定是WPF框架中的一个重要功能,它能够帮助我们将数据与界面进行绑定,使数据的变化自动反映在界面上。下面,我会给出关于数据绑定的详细介绍,包括数据绑定的意义、数据绑定的实现方式、数据绑定的语法等。同时,还会通过两个示例来说明数据绑定的应用。 1. 数据绑定的意义 在传统的Windows应用中,数据更新通常都是手动进行的,这样就需要在代码中写入大量…

    C# 2023年5月31日
    00
  • c#继承与多态使用示例

    我可以为您解释下“C#继承与多态使用示例”的完整攻略。 标题 标题是标识文章主题的必要元素,我们可以通过#符号来对标题进行标注,例如: # C#继承与多态使用示例 继承 在 C# 中,类可以通过继承从另一个类中获得其成员。继承的语法为: class SubClass : SuperClass { //子类成员 } 在此示例中,SubClass 会从 Supe…

    C# 2023年6月1日
    00
  • c# SqlDataAdapter中的Fill是怎么实现的

    我们先来介绍一下SqlDataAdapter,它是一个在C#中用于填充DataSet和DataTable的重要类。SqlDataAdapter提供了以下核心方法: Fill(DataSet):将数据填充到DataSet中。 Fill(DataTable):将数据填充到DataTable中。 Fill(int, int, DataTable[]):将一组数据填…

    C# 2023年6月6日
    00
  • C#正则表达式实用大全(建议收藏!)

    C#正则表达式实用大全(建议收藏!) 什么是正则表达式? 正则表达式是一种文本模式,通常被用来检索、替换那些符合某个模式的文本。在C#中,我们可以使用正则表达式来进行字符串匹配、查找和替换等操作。 正则表达式的语法 在C#中,正则表达式语法使用的是Perl风格的语法,它包含了很多元字符和修饰符,可以用来匹配常见的文本模式。下面是一些常用的正则表达式元字符: …

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