以 WinForms 應用程式舉例,在發布時會產生下列檔案:
其中主要的 ConsoleAppWinFormsTest.exe 只有 150 KB,但是需要電腦有安裝 .NET Desktop Runtime 才能正常執行。
若想要包含執行環境則會超過 256 個檔案,超過 156 MB
想要發布單一檔案則需要在 csproj 檔案中增加 PublishSingleFile
使用 dotnet publish 以目前的作業系統為目標作業系統環境發布:
使用 dotnet publish 指定目標作業系統環境發布:
在包含執行環境的情況下變為只有 7 個檔案,總共約占用 151 MB
若不想要包含執行環境,可以附加 --no-self-contained 參數 (註:包含執行環境是 --sc 或是 --self-contained 參數)
只會產生兩個檔案,大小總共約 176 KB
還可以再透過在 csproj 檔案中設定 DebugType 參數為 embedded 隱藏 .pdb 檔案
就只會有一個檔案,檔案大小為 167 KB
另外透過下面這行指令就可以不在 csproj 檔案中設定,就不包含執行環境、不產生 .pdb 檔案,只輸出一個 exe 檔案:
補充:
常見 Windows RID: 使用 win, win7, win81, win10 和 x64, x86, arm, arm64 組合,中間以減號(-) 串接,例如:win-x64, win81-arm 和 win10-arm64 等,具體可以參考微軟官方文件
參考資料:
Microsoft.Learn - Single-file deployment and executable
Microsoft.Learn - C# Compiler Options that control code generation
ConsoleAppWinFormsTest/bin/Debug/net7.0-windows/
`-- publish/
|-- ConsoleAppWinFormsTest.deps.json
|-- ConsoleAppWinFormsTest.dll
|-- ConsoleAppWinFormsTest.exe
|-- ConsoleAppWinFormsTest.pdb
`-- ConsoleAppWinFormsTest.runtimeconfig.json
其中主要的 ConsoleAppWinFormsTest.exe 只有 150 KB,但是需要電腦有安裝 .NET Desktop Runtime 才能正常執行。
若想要包含執行環境則會超過 256 個檔案,超過 156 MB
想要發布單一檔案則需要在 csproj 檔案中增加 PublishSingleFile
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
</Project>
使用 dotnet publish 以目前的作業系統為目標作業系統環境發布:
dotnet publish
使用 dotnet publish 指定目標作業系統環境發布:
dotnet publish -r win-x64
在包含執行環境的情況下變為只有 7 個檔案,總共約占用 151 MB
ConsoleAppWinFormsTest/bin/Debug/net7.0-windows/
`-- publish/
|-- ConsoleAppWinFormsTest.exe 147,193 KB
|-- ConsoleAppWinFormsTest.pdb 14 KB
|-- D3DCompiler_47_cor3.dll 4,802 KB
|-- PenImc_cor3.dll 156 KB
|-- PresentationNative_cor3.dll 1,206 KB
|-- vcruntime140_cor3.dll 97 KB
`-- wpfgfx_cor3.dll 1,913 KB
若不想要包含執行環境,可以附加 --no-self-contained 參數 (註:包含執行環境是 --sc 或是 --self-contained 參數)
dotnet publish --no-self-contained
只會產生兩個檔案,大小總共約 176 KB
ConsoleAppWinFormsTest/bin/Debug/net7.0-windows/
`-- publish/
|-- ConsoleAppWinFormsTest.exe 160 KB
`-- ConsoleAppWinFormsTest.pdb 14 KB
還可以再透過在 csproj 檔案中設定 DebugType 參數為 embedded 隱藏 .pdb 檔案
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<PublishSingleFile>true</PublishSingleFile>
<DebugType>embedded</DebugType>
</PropertyGroup>
</Project>
就只會有一個檔案,檔案大小為 167 KB
ConsoleAppWinFormsTest/bin/Debug/net7.0-windows/
`-- publish/
`-- ConsoleAppWinFormsTest.exe 160 KB
另外透過下面這行指令就可以不在 csproj 檔案中設定,就不包含執行環境、不產生 .pdb 檔案,只輸出一個 exe 檔案:
dotnet publish -r win-x64 -p:PublishSingleFile=true -p:DebugType=embedded --no-self-contained
補充:
常見 Windows RID: 使用 win, win7, win81, win10 和 x64, x86, arm, arm64 組合,中間以減號(-) 串接,例如:win-x64, win81-arm 和 win10-arm64 等,具體可以參考微軟官方文件
參考資料:
Microsoft.Learn - Single-file deployment and executable
Microsoft.Learn - C# Compiler Options that control code generation
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com