.NET Core 提供的發佈應用程式選項 self-contained 是共用應用程式的好方法,因為應用程式的發佈目錄包含所有組件、運行時和框架。您只需要告訴使用者應用程式的入口 exe 文件,就可以使程式運行起來,而不必擔心目標電腦上是否存在.NET Core 運行時和應用框架。目前 .NET ...
.NET Core 提供的發佈應用程式選項 self-contained 是共用應用程式的好方法,因為應用程式的發佈目錄包含所有組件、運行時和框架。您只需要告訴使用者應用程式的入口 exe 文件,就可以使程式運行起來,而不必擔心目標電腦上是否存在.NET Core 運行時和應用框架。目前 .NET Core 3.0 Preview 6 已經推出,也包含了更多新功能。其中一個有用的功能就是引入了 PublishTrimmed 發佈標誌。此標誌可以很大程式上減少可執行文件的大小並會創建一個修剪過的自包含單體可執行文件。下麵我們來看一下如何發佈一個經過修剪的單體可執行文件。
.NET Core 3.0 中發佈 self-contained 程式可以使用下麵的命令:
dotnet publish -r win-x64 -c Release --self-contained
上面的命令執行之後會在創建的發佈文件夾中包含 self-contained 可執行程式所需的所有文件,文件數大概有 100 個左右,如果想要在目標電腦上運行這個應用程式,那就需要複製這個發佈文件夾內所有文件,似乎並不是那麼方便,而且這些文件占用的空間也不算小。
這個問題在 .NET Core 3.0 Preview 5 中得到瞭解決。此版本引入了一個 PublishSingleFile 發佈標誌,用於生成一個單體 exe 可執行文件。該發佈標誌的使用方法如下:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
或者在項目文件中配置如下節點:
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <RootNamespace>Hello_.NETCore3</RootNamespace> <PublishSingleFile>true</PublishSingleFile> <RuntimeIdentifier>win-x64</RuntimeIdentifier> </PropertyGroup>
使用此發佈標誌後只會生成一個 exe 可執行文件和符號文件。見下圖
現在只有一個可執行文件了,但其文件大小有點兒小問題,一個可執行程式接近 70MB 。上面說過,在 .NET Core 3.0 Preview 6 中引入了 PublishTrimmed 發佈標誌,使用該發佈選項將不會包含您未使用的類庫,以達到減小發佈單體文件的尺寸。您可以將上面的兩個命令一起使用,如下:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true
或在項目文件中配置以上兩個發佈標誌:
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <RootNamespace>Hello_.NETCore3</RootNamespace> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> <RuntimeIdentifier>win-x64</RuntimeIdentifier> </PropertyGroup>
使用上面的兩個命令後,您會發現,單體可執行文件的尺寸只有 29MB 了。對於簡單的控制台應用程式來說,它仍然有點兒大,但請註意,這是一個包含了 .NET Core 運行時的 self-contained 應用程式。
以上就是我要介紹的全部內容了。
原文鏈接:https://www.talkingdotnet.com/create-trimmed-self-contained-executable-in-net-core-3-0/
譯者註:
參考鏈接:
- https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0-preview-6/
- https://github.com/mono/linker/blob/master/src/ILLink.Tasks/README.md