C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁
PublishFolderCleaner – Github
测试环境:
.Net 8
Program.cs 代码
// https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics;
using System.Text;// 名称, 不用写 .exe
var exeName = "AbpDemo";
// 目录
var publishFolder = "D:\\Work\\CSharpProject\\AbpDemo\\AbpDemo\\bin\\Debug\\net8.0";const string libFolderName = "lib";
var libFolder = Path.GetFullPath(Path.Combine(publishFolder, libFolderName));
var tempFolder = Path.GetFullPath(Path.Combine(publishFolder, @"..", Path.GetRandomFileName()));
Directory.Move(publishFolder, tempFolder);
Directory.CreateDirectory(publishFolder);
Directory.Move(tempFolder, libFolder);var appHostFilePath = Path.Combine(libFolder, exeName + ".exe");
var newAppHostFilePath = Path.Combine(publishFolder, exeName + ".exe");File.Move(appHostFilePath, newAppHostFilePath);Patch(newAppHostFilePath, Path.Combine("lib", exeName + ".dll"));/// <summary>
/// 这里有 1024 个 byte 空间用来决定加载路径
/// 详细请看 dotnet runtime\src\installer\corehost\corehost.cpp 的注释
/// </summary>
const int MaxPathBytes = 1024;int Patch(string appHostExe, string newPath)
{try{var origPath = Path.GetFileName(ChangeExecutableExtension(appHostExe));if (!File.Exists(appHostExe)){Console.WriteLine($"AppHost '{appHostExe}' does not exist");return 1;}if (origPath == string.Empty){Console.WriteLine("Original path is empty");return 1;}var origPathBytes = Encoding.UTF8.GetBytes(origPath + "\0");Debug.Assert(origPathBytes.Length > 0);var newPathBytes = Encoding.UTF8.GetBytes(newPath + "\0");if (origPathBytes.Length > MaxPathBytes){Console.WriteLine($"Original path is too long");return 1;}if (newPathBytes.Length > MaxPathBytes){Console.WriteLine($"New path is too long");return 1;}var appHostExeBytes = File.ReadAllBytes(appHostExe);int offset = GetOffset(appHostExeBytes, origPathBytes);if (offset < 0){Console.WriteLine($"Could not find original path '{origPath}'");return 1;}if (offset + newPathBytes.Length > appHostExeBytes.Length){Console.WriteLine($"New path is too long: {newPath}");return 1;}for (int i = 0; i < newPathBytes.Length; i++)appHostExeBytes[offset + i] = newPathBytes[i];File.WriteAllBytes(appHostExe, appHostExeBytes);return 0;}catch (Exception ex){Console.WriteLine(ex.ToString());return 1;}
}string ChangeExecutableExtension(string apphostExe) =>// Windows apphosts have an .exe extension. Don't call Path.ChangeExtension() unless it's guaranteed// to have an .exe extension, eg. 'some.file' => 'some.file.dll', not 'some.dll'apphostExe.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) ? Path.ChangeExtension(apphostExe, ".dll") : apphostExe + ".dll";int GetOffset(byte[] bytes, byte[] pattern)
{int si = 0;var b = pattern[0];while (si < bytes.Length){si = Array.IndexOf(bytes, b, si);if (si < 0)break;if (Match(bytes, si, pattern))return si;si++;}return -1;
}bool Match(byte[] bytes, int index, byte[] pattern)
{if (index + pattern.Length > bytes.Length)return false;for (int i = 0; i < pattern.Length; i++){if (bytes[index + i] != pattern[i])return false;}return true;
}
效果真不错

相关文章:
C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁
PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…...
[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)
序言 之前开发的耕地占补平衡报备格式,现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具(插件),需要授权后才能使用; 本软件…...
todolist
一开始想自己写个todolist的网页,一直没时间,直接拿这个博客记录了,因为仅我可见比较麻烦,就放在全部可见记录了 目录 2024年3月todoes了解一下深入学习k8s,比如pod运行多个容器 ,编写自己的镜像 2024年2月…...
【Java程序设计】【C00307】基于Springboot的基Hadoop的物品租赁管理系统(有论文)
基于Springboot的基Hadoop的物品租赁管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的基于 Hadoop的物品租赁系统的设计与实现,本系统有管理员、用户二种角色权限; 前台首页&#…...
GIT中对子仓库的使用方法介绍
git 子仓库 主仓库中添加子仓库 git submodule add <url> <path>更新子代码代码 git submodule update --init克隆含有子仓库的仓库 git clone --recurse-submodules <url>主仓库中删除子仓库 1、进入包含子仓库的父仓库的根目录 2、使用以下命令将子仓…...
ClickHouse 指南(三)最佳实践 -- 跳数索引
Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下,关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此,选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…...
Mybatis总结--传参二
#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为?占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数,需要通过名称使…...
2024年数字化转型风口趋势大赏
人工智能和自动化确实为提高效率和数据驱动的见解提供了巨大的潜力,但这些技术无法完全取代人类技能和情境决策。在混合模型中将人工智能功能与人类专业知识相结合的企业将实现最大的效益。 随着人工智能和自动化的不断发展,企业必须调整其战略、流程和人…...
某款服务器插上4张TDP功耗75瓦PCIE卡无法开机的调试过程
1.服务器厂家说这款服务器测过别家的4卡,所以一开始并没有怀疑服务器硬件有问题 2.拔掉另外三张,只保留cpu0对应的riser0 slot0上的一张卡,仍然无法开机。 3.怀疑是这张pcie卡bar空间太大导致。换另一款bar空间小的卡,仍然无法开…...
数据结构与算法——排序算法
目录 文章目录 前言 一.排序的基本概念 1.什么是就地排序 2.什么是内部排序和外部排序 3.什么是稳定排序 4.判定一个排序算法的是稳定的 二.插入排序算法 1.直接插入排序 1.1基本思想 1.2复杂度 1.3稳定性 1.4代码演示 2.折半插入排序 2.1基本思想 2.2性能 3.…...
阿里巴巴alibaba API商品详情接口系列(商品属性,价格,主图)阿里巴巴alibaba根据ID取商品详情 API 返回值说明
阿里巴巴Alibaba的API商品详情接口系列通常用于获取指定商品的详细信息,包括商品属性、价格、主图等。与来赞达Lazada的API类似,具体的返回值可能会根据API的版本和阿里巴巴平台的更新而有所不同。 以下是一个假设的阿里巴巴API商品详情接口的返回值示例…...
lcd画圆
//****************************************************************** //函数名: _draw_circle_8 //功能: 8对称性画圆算法(内部调用) //输入参数:(xc,yc) :圆中心坐标 // (x,y):光标相对于圆心的坐标 // c:填…...
React组件详解
React组件分为两大类 1.函数组件 2.类组件(最常用) 组件化 import ReactDom from "react-dom";// // 1.通过函数创建一个组件 // 2.函数名字必须大写开头 // 3.函数必须有返回值 function Func1() {return <h2>这是一个基础组件</h…...
C++面试:内存溢出、内存泄漏的原因与解决
目录 内存溢出(Memory Overflow) 内存溢出介绍 解决内存溢出问题的方法 内存泄漏(Memory Leak) 内存泄露基础 解决内存泄漏问题的方法 内存溢出(Memory Overflow) 内存溢出介绍 内存溢出是指程序在执…...
【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找
一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…...
kaldi 详细安装教程、PyTorch-Kaldi、TIMIT下载、Librispeech下载
kaldi 详细安装教程 本kaldi 安装教程 转载于该链接kaldi 详细安装教程 安装系统依赖(如果经常使用linux 服务器,一般都会有) apt-get updateapt-get install -y --no-install-recommends g make automake autoconf bzip2 unzip wget sox …...
EtherCAT 转 ModbusTCP 网关
功能概述 本产品是 EtherCAT 和 Modbus TCP 网关,使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站,接 TwinCAT 、CodeSYS 、PLC 等;在 ModbusTCP 侧做为 ModbusTCP 主站(Client)或从站(Se…...
iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)
iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件,可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点: 数据备份和恢复:iMazing 提供了强大的数据备份和恢复功能,可以备份 iOS 设备上的各种数据…...
carpower
车载android 电源管理 车载音响电源管理器_definitely的技术博客_51CTO博客...
数据结构2月25日
第一道: 第二道: 1、插入到prev和next中间 1.new(struct list_head*)malloc(sizeof(struct list_head*)); if(newNULL) { printf("失败\n"); return; } new->nextprev->next; prev->nextnew; return; 2、删除prve和next…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
vue3 手动封装城市三级联动
要做的功能 示意图是这样的,因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...
ABB馈线保护 REJ601 BD446NN1XG
配电网基本量程数字继电器 REJ601是一种专用馈线保护继电器,用于保护一次和二次配电网络中的公用事业和工业电力系统。该继电器在一个单元中提供了保护和监控功能的优化组合,具有同类产品中最佳的性能和可用性。 REJ601是一种专用馈线保护继电器…...
