一、什么是 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技术站