在.net項目開發中,隨著項目複雜性的增加,依賴的dll文件也會逐漸增多。這往往導致輸出目錄混亂,不便於管理和部署。而netbeauty2開源項目正是為了解決這一問題而生,它能夠幫助開發者在獨立發布.net項目時,將.net運行時和依賴的dll文件移動到指定的目錄,從而讓輸出目錄更加乾淨、清爽。
1. netbeauty2簡介
netbeauty2是一個開源的.net依賴庫整理工具,它的主要作用是在.net項目獨立發布時,對輸出目錄進行整理和優化。通過netbeauty2,開發者可以輕鬆地將.net運行時和依賴的dll文件移動到指定的目錄,使得項目的輸出目錄更加清晰、易於管理。
项目仓库地址:https://github.com/nulastudio/NetBeauty2
下图为优化后输出目录(.NET运行时及引用依赖库移到libraries目录,目录名可配置):

下图为极限优化后输出目录(查看 --hiddens 选项使用)

再来对比下未使用前输出目录(震撼吧!.NET运行时及相关依赖库全放在了根输出目录,.NET Framework可以配置privatePath,.NET Core可没那么方便):

2. 支持情況
| NetBeauty 2 | NetCoreBeauty | |
|---|---|---|
| 支持框架 | .NET Framework .NET Core 3.0+ |
.NET Core 2.0+ |
| 支持部署模式 | Framework-dependent deployment (FDD) Self-contained deployment (SCD) Framework-dependent executables (FDE) |
Self-contained deployment (SCD) |
| 支持作業系統 | All | win-x64 win-x86 win-arm64(.NET 6+) linux-x64 linux-arm linux-arm64 osx-x64 osx-arm64(.NET 6+) |
| Need Patched HostFXR | No Yes(if use patch) | Yes |
| Minimum Structure | ~20 Files ~8 Files(if use patch) | ~8 Files |
| How It Works | STARTUP_HOOKS AssemblyLoadContext.Resolving AssemblyLoadContext.ResolvingUnmanagedDll + patched libhostfxr(if use patch) additionalProbingPaths(if use patch) |
patched libhostfxr additionalProbingPaths |
| Shared Runtime | Yes | Possible If Using patched libhostfxr Alone |
3. 如何使用?
3.1.準備工作
在你的.net core工程(需要發布的主工程)添加nuget包:
dotnet add package nulastudio.NetBeauty
打开工程文件编辑(.csproj):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<BeautySharedRuntimeMode>False</BeautySharedRuntimeMode>
<!-- beauty into sub-directory, default is libs, quote with "" if contains space -->
<BeautyLibsDir Condition="$(BeautySharedRuntimeMode) == 'True'">../libraries</BeautyLibsDir>
<BeautyLibsDir Condition="$(BeautySharedRuntimeMode) != 'True'">./libraries</BeautyLibsDir>
<!-- dlls that you don't want to be moved or can not be moved -->
<!-- <BeautyExcludes>dll1.dll;lib*;...</BeautyExcludes> -->
<!-- dlls that end users never needed, so hide them -->
<!-- <BeautyHiddens>hostfxr;hostpolicy;*.deps.json;*.runtimeconfig*.json</BeautyHiddens> -->
<!-- set to True if you want to disable -->
<DisableBeauty>False</DisableBeauty>
<!-- set to False if you want to beauty on build -->
<BeautyOnPublishOnly>False</BeautyOnPublishOnly>
<!-- DO NOT TOUCH THIS OPTION -->
<BeautyNoRuntimeInfo>False</BeautyNoRuntimeInfo>
<!-- set to True if you want to allow 3rd debuggers(like dnSpy) debugs the app -->
<BeautyEnableDebugging>False</BeautyEnableDebugging>
<!-- the patch can reduce the file count -->
<!-- set to False if you want to disable -->
<!-- SCD Mode Feature Only -->
<BeautyUsePatch>True</BeautyUsePatch>
<!-- App Entry Dll = BeautyDir + BeautyAppHostDir + BeautyAppHostEntry -->
<!-- see https://github.com/nulastudio/NetBeauty2#customize-apphost for more details -->
<!-- relative path based on AppHostDir -->
<!-- .NET Core Non Single-File Only -->
<!-- <BeautyAppHostEntry>bin/MyApp.dll</BeautyAppHostEntry> -->
<!-- relative path based on BeautyDir -->
<!-- .NET Core Non Single-File Only -->
<!-- <BeautyAppHostDir>..</BeautyAppHostDir> -->
<!-- <BeautyAfterTasks></BeautyAfterTasks> -->
<!-- valid values: Error|Detail|Info -->
<BeautyLogLevel>Info</BeautyLogLevel>
<!-- set to a repo mirror if you have troble in connecting github -->
<!-- <BeautyGitCDN>https://gitee.com/liesauer/HostFXRPatcher</BeautyGitCDN> -->
<!-- <BeautyGitTree>master</BeautyGitTree> -->
</PropertyGroup>
<ItemGroup>
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.4" />
</ItemGroup>
</Project>
运行 dotnet build 或者 dotnet publish, 优化输出操作会自动完成。
3.2.如果應用已經發布?
如果你的應用程式已經發布,可以這樣使用(站長沒試過,這可以作為發布後補償措施):
Usage:
nbeauty2 [--loglevel=(Error|Detail|Info)] [--srmode] [--enabledebug] [--usepatch] [--hiddens=hiddenFiles] [--noruntimeinfo] [--roll-forward=<rollForward>] [--apphostentry=<appHostEntry>] [--apphostdir=<appHostDir>] <beautyDir> [<libsDir> [<excludes>]]
例如:
ncbeauty2 --usepatch --loglevel Detail --hiddens "hostfxr;hostpolicy;*.deps.json;*.runtimeconfig*.json" /path/to/publishDir libraries "dll1.dll;lib*;..."
3.3.配置為.net core全局工具
dotnet tool install --global nulastudio.nbeauty
安裝後在程式發布時會自動應用。
4. 各種項目使用示例
克隆仓库(https://github.com/nulastudio/NetBeauty2),里面有各种模版项目使用示例:

| 測試工程名 | 說明 |
|---|---|
| WPFTest | wpf項目(winform類似),默認.net 5 |
| WebAppTest | razorpages項目,默認.net 6 |
| NetFxTest | net framework wpf項目(.net 4.x,winform類似) |
| ChromelyTest | 引用了chromely的.net項目 |
| AvaloniaTest | avalonia ui項目,默認.net 5 |
小知識1
chromely nuget包是一個用於創建跨平台桌面應用的庫,它提供了一個基於chromium的瀏覽器控制項。通過chromely,開發者可以使用web技術(如html、css和javascript)來構建桌面應用的用戶界面,同時保留對本地系統資源的訪問。
chromely nuget包提供了一套完整的api和工具,使得開發者可以輕鬆地將web應用程式轉換為桌面應用程式,而無需進行大量的代碼重寫或修改。它還支持各種插件和擴展,以便開發者可以根據需要添加額外的功能或定製現有的功能。
此外,chromely還支持多種程式語言和框架,如c#、.net core、asp.net core等,這使得開發者可以選擇他們最熟悉的技術棧來構建應用程式。
小知識2
avalonia ui是一個跨平台的.net ui框架,它允許開發者使用xaml和c#語言創建可在多個平台上運行的應用程式,包括windows、linux、macos、ios、android以及webassembly。avalonia ui旨在幫助開發者構建漂亮、現代的圖形用戶界面(gui)。它兼容所有支持.net standard 2.0的平台,使開發者能夠從單個代碼庫創建適用於多個作業系統的原生應用程式。通過使用avalonia ui,開發者可以充分利用.net生態系統的強大功能,同時實現跨平台兼容性,降低開發成本並提高開發效率。
5. 總結
林德熙大佬分享过类似的包NuGet Gallery | dotnetCampus.PublishFolderCleaner 3.11.1,但该库说明只在Windows发布支持,大家可以对比使用,原文链接:PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁 - lindexi - 博客园 (cnblogs.com),再次给出本文介绍库NetBeauty2开源地址:
项目仓库地址:https://github.com/nulastudio/NetBeauty2
參考: