打赏

.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 服务

posted @ 2024-06-30 12:16  Bear.Tirisfal  阅读(35)  评论(0编辑  收藏  举报