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.準備作業の準備
NuGetパッケージを. NET Coreプロジェクト(リリースが必要なメインプロジェクト)に追加します。
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 Global Toolsとしての設定
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を使用すると、開発者はHTML、CSS、Java ScriptなどのWebテクノロジを使用して、ローカルシステムリソースへのアクセスを維持しながらデスクトップアプリケーションのユーザーインターフェイスを構築できます。
Chromely NuGetパッケージはAPIとツールの完全なセットを提供し、開発者は大幅なコードの書き直しや変更を必要とせずにWebアプリケーションをデスクトップアプリケーションに簡単に変換できます。また、さまざまなプラグインや拡張機能をサポートしているため、開発者は必要に応じて追加機能を追加したり、既存機能をカスタマイズできます。
さらに、ChromelyはC#、. NET Core、ASP.NET Coreなどの複数のプログラミング言語やフレームワークをサポートしているため、開発者はアプリケーションを構築するために最も使い慣れたテクノロジースタックを選択できます。
小さな知識2。
Avalonia UIはクロスプラットフォームの. NET UIフレームワークで、開発者はXAMLとC#言語を使用して、Windows、Linux、macOS、iOS、Android、Web Assemblyを含む複数のプラットフォームで動作するアプリケーションを作成できます。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
参考文献より: