.NET 使用指令發布單一執行檔

以 WinForms 應用程式舉例,在發布時會產生下列檔案:
	
		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

留言