.NET Core 6引入了創建單文件可執行文件的功能。這隻允許分發一個應用程式文件,因為所有配置和依賴項都包含在二進位文件本身中。 該功能為依賴項嵌入提供了一種本機方法,這在發佈生成數百個程式集的獨立應用程式時最有益。它可用於依賴於框架或自包含的應用程式,但在這兩種情況下都需要設置運行時標識符以針 ...
.NET Core 6引入了創建單文件可執行文件的功能。這隻允許分發一個應用程式文件,因為所有配置和依賴項都包含在二進位文件本身中。
該功能為依賴項嵌入提供了一種本機方法,這在發佈生成數百個程式集的獨立應用程式時最有益。它可用於依賴於框架或自包含的應用程式,但在這兩種情況下都需要設置運行時標識符以針對特定環境和位數。
開始
首先,讓我們看看發佈 .NET Core 應用程式的常規過程是什麼樣的。
假設我們有一個名為 ConsoleApp 的 .NET Core 6 應用程式,由以下項目文件定義:
- <Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp6</TargetFramework>
- </PropertyGroup>
- </Project>
要發佈此應用程式,我們將使用以下命令:
- dotnet publish .\ConsoleApp.csproj -c Release -r win-x64
上面的命令將在“發佈”模式下構建應用程式,然後發佈為自包含並面向 Windows 64 位系統。所有依賴項(包括 .NET Core 框架程式集)和配置都將複製到已發佈的目錄中。
發佈完成後,轉到輸出目錄(對於上面的應用程式,這將是 \ConsoleApp\bin\Release\netcoreapp6\win-x64\publish\)。註意目錄中存在多少個文件。
發佈獨立 .NET Core 應用程式的過程可以可視化如下:
使用單文件可執行文件
現在,讓我們將應用程式發佈為單個文件。我們需要做的就是添加一個值設置為 true 的 PublishSingleFile 屬性。
- <Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp6</TargetFramework>
- <PublishSingleFile>true</PublishSingleFile> <!-- add this line -->
- </PropertyGroup>
- </Project>
讓我們再次發出發佈命令:
- dotnet publish .\ConsoleApp.csproj -c Release -r win-x64
完成此過程後,導航到已發佈的目錄(上述應用的 \ConsoleApp\bin\Release\netcoreapp6\win-x64\publish\)。您應該只看到 1 個.exe文件和一個 .pdb 文件(可選)。
讓我們看看啟用單文件後發佈過程有何變化:
集成智能裝配
對於最後一步,讓我們在程式集捆綁到單文件可執行文件之前保護它。
SmartAssembly 將在生成應用程式之後執行,但在發佈並捆綁到單個文件之前執行。如下圖所示:
步驟 1:創建智能程式集項目
- 打開智能裝配。
- 單擊“新建項目”。
- 單擊“瀏覽程式集”。
- 導航到應用程式的輸出目錄,選擇適當的程式集(對於上面的應用程式,它將是:\ConsoleApp\bin\Release\netcoreapp6\win-x64\ConsoleApp.dll)並打開。
- 單擊設置目的地。
- 導航到應用程式的 \obj\ 目錄(對於上面的應用程式,它將是:\ConsoleApp\obj\Release\netcoreapp6\win-x64\ConsoleApp.dll)並保存。如果文件已存在,請單擊“是”進行覆蓋。
- 根據需要配置項目。啟用應用程式可能需要的任何保護。
- 單擊保存以保存項目。建議將項目保存在與Visual Studio的項目文件相同的位置,名稱相同(對於上面的應用,它將是:\ConsoleApp\ConsoleApp.saproj)。
保護單文件程式集時,不應使用“依賴項合併”和“依賴項嵌入”。合併或嵌入程式集可能會導致意外行為,不建議用於此類應用程式。
步驟 2:將智能程式集集成到發佈過程中
- 在 Visual Studio 中打開應用程式的項目。
- 右鍵單擊項目名稱,然後選擇“管理 NuGet 包...”
- 切換到瀏覽選項卡。
- 鍵入 RedGate.SmartAssembly.MSBuild,然後單擊它旁邊的安裝。
就是這樣!執行上述步驟後,項目文件應如下所示:
- <Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp6</TargetFramework>
- <PublishSingleFile>true</PublishSingleFile>
- </PropertyGroup>
- <ItemGroup>
- <PackageReference Include="RedGate.SmartAssembly.MSBuild" Version="8.1.2.4975">
- <PrivateAssets>all</PrivateAssets>
- <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
- </PackageReference>
- </ItemGroup>
- </Project>
現在讓我們再次發出發佈命令:
- dotnet publish .\ConsoleApp.csproj -c Release -r win-x64
如果要運行同一項目的多個連續生成,則應在每次生成之前或之後清理項目。由於 SmartAssembly 將程式集模糊處理到 \obj\ 目錄中,因此下次生成命令可能會選取經過模糊處理的版本,從而導致雙重模糊處理和其他意外結果。
要清理項目,請手動刪除 \obj\ 目錄或發出以下命令(使用用於發佈的相同配置和運行時標識符):
dotnet clean .\ConsoleApp.csproj -c Release -r win-x64
如果一切順利,您應該會在命令行中看到其他輸出消息,確認 SmartAssembly 已成功保護您的應用程式(為清楚起見,縮短了路徑):
Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 206.38 ms for C:\[..]\ConsoleApp\ConsoleApp.csproj.
ConsoleApp -> C:\[..]\ConsoleApp\bin\Release\netcoreapp6\win-x64\ConsoleApp.dll
Executing SmartAssembly from: C:\PROGRA~1\Red Gate\SmartAssembly 8\SmartAssembly.com
Using project: C:\[..]\ConsoleApp\ConsoleApp.saproj
SmartAssembly v8.1.2.4975 Personal
Copyright c Red Gate Software Ltd 2005-2020
Loading project C:\[..]\ConsoleApp\ConsoleApp.saproj
Input=C:\[..]\ConsoleApp\bin\Release\netcoreapp3.1\win-x64\ConsoleApp.dll
Loading...
Starting...
Analyzing...
Preparing...
Creating assembly...
Copying additional files...
OK
ConsoleApp -> C:\[..]\ConsoleApp\bin\Release\netcoreapp3.1\win-x64\publish\