.net8,全网首发:部署为自带环境的前后端分离项目,编译成二进制机器码,防止反编译
环境:win10+.net8+vs2022+vue3(history路由模式)本文只演示在winows上面的部署
目的:
1.防止反编译,增加破解成本
2.更便捷的部署方式,开箱即用
实现:
1.不依赖容器,包括IIS,apache,docker,nginx等
2.更少的文件,所有dll逻辑打包成一个exe文件(如果是win环境是exe,不同环境不一样)
3.编译为二进制机器码,防止反编译
4.在windows上,作为windows服务运行。开机自启动
一、代码支持
首先,禁止使用 GetCurrentDirectory
来获取资源路径,使用AppContext.BaseDirectory
代替,因为如果做成windows服务,前者获取出来的路径会是win32目录下,我们也要习惯于使用AppContext.BaseDirectory
或者 env.ContentRootPath
来获取项目目录,而不是 GetCurrentDirectory
其次,关于代码,需要对单文件部署不支持的方法进行过滤和修改,请检查项目中是否有使用这些方法,目前不支持的方法如下:
//禁止使用的方法
Assembly.CodeBase //引发 PlatformNotSupportedException。
Assembly.EscapedCodeBase //引发 PlatformNotSupportedException。
Assembly.GetFile //引发 IOException。
Assembly.GetFiles //引发 IOException。
Assembly.Location //返回空字符串。
AssemblyName.CodeBase //返回 null。
AssemblyName.EscapedCodeBase //返回 null。
Module.FullyQualifiedName //返回值为 <Unknown> 的字符串,或引发异常。
Marshal.GetHINSTANCE //返回 -1。
Module.Name 返回值为 <Unknown> //的字符串。
1.添加支持静态资源
//Kestrel url重写,此处是为了支持vue histroy路由模式的 项目
app.UseRewriter(new RewriteOptions()
.AddRewrite("^(?!api|swagger|assets).*", "index.html", skipRemainingRules: true));\\屏蔽以**开头的url,其他都重定向到index
//静态资源访问
app.UseStaticFiles();
app.UseDefaultFiles();
2.修改并支持windows服务安装
**main.cs**
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseWindowsService();
builder.Environment.ContentRootPath = AppContext.BaseDirectory;
builder.Services.AddWindowsService();
builder.Services.AddHostedService<WorkerService>();
** WorkerService.cs**
namespace yourNamepece.Web
{
public class WorkerService : BackgroundService
{
public WorkerService(ILoggerFactory loggerFactory)
{
Logger = loggerFactory.CreateLogger<WorkerService>();
}
public ILogger Logger { get; }
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
Logger.LogInformation($"{nameof(WorkerService)}is starting.");
stoppingToken.Register(() => Logger.LogInformation($"{nameof(WorkerService)} is stopping."));
while (!stoppingToken.IsCancellationRequested)
{
Logger.LogInformation($"{nameof(WorkerService)} is doing background work.");
await Task.Delay(TimeSpan.FromSeconds(60), stoppingToken);
}
Logger.LogInformation($"{nameof(WorkerService)} has stopped.");
}
}
}
二、项目发布
vs2022发布选项里面能够轻松的将项目打包成单文件形式,
1.部署模式选择 独立
,选择后会将.net环境打包到发布文件中,目前版本大概130m
左右,对于一个环境而言130m确实不算大
2.勾选生成单文件,会将所有依赖应用程序的文件捆绑到一个二进制文件中
3.勾选ReadyToRun后,应用程序集编译为 ReadyToRun (R2R) 格式来改进 .NET Core 应用程序的启动时间和延迟。 R2R 是一种预先 (AOT) 编译形式。
,部分编译为AOT,运行速度会更快,但是文件会增大。如果不是特别需要可以不用勾选
4.关于裁剪选项,发布后可能会有问题,慎选
关于前端vue项目,打包后放在当前程序wwwroot
文件夹下面即可
*** 三、项目部署***
直接通过 bat脚本安装服务
**安装服务.bat**
chcp 65001
set serviceName=你的exe文件名称,不包括.exe,将作为服务名称
set serviceFilePath=%~dp0
set serviceDescription=你的服务描述
sc.exe create %serviceName% BinPath=%serviceFilePath%%serviceName%.exe
sc.exe config %serviceName% start=auto
sc.exe description %serviceName% %serviceDescription%
sc.exe start %serviceName%
pause
**卸载服务.bat**
set serviceName=服务名称
sc.exe stop %serviceName%
sc.exe delete %serviceName%
pause
以上便完成了程序的发布和部署的步骤
再来监测一下exe看看
完成,上面发布的地方我为什么要选ReadyToRun, 如果不选ReadyToRun,可能只是套了层pe,做过破解的朋友应该知道,这个应该不难脱
有任何疑问和讨论都可以在下面评论或通过邮件联系我571115139@qq.com
奉上官方相关文档
单文件部署
ReadyToRun 编译
Kestrel的UrlRewrite
使用 BackgroundService 创建 Windows 服务