[英]Publish .NET Core App As Portable Executable
我有一個簡單的 .net 核心應用程序並通過以下命令發布它:
dotnet publish -c Release -r win10-x64
SqlLocalDbStarter.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Win32.Registry" Version="4.5.0" />
</ItemGroup>
</Project>
當發布過程完成 dotnet 在bin\\Release
文件夾中創建win10-x64
文件夾然后打開它后,該文件夾包含publish
文件夾和一些 dll 和 exe 文件。
我有一些問題:
exe
文件(在發布文件夾內/外)?exe
文件並將其移動到其他地方時它不運行(沒有消息)?dll
文件來運行應用程序,那么我有兩個選項(內部/外部發布文件夾),內部發布文件夾大小為 66 MB,但外部發布文件夾大小為 1 MB。exe
文件來運行我的程序而沒有 dll 文件。 .NET Core 3.0 開箱即用地支持它。 它將所有內容打包在一個.exe
文件中(基本控制台應用程序約為 68 MB)。 PublishTrimmed=true
選項可以通過分析靜態代碼引用並從最終構建中排除未使用的框架程序集,將大小減少到 ~28 MB。
要配置single exe
構建,請編輯您的csproj
文件:
<PropertyGroup>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
或在帶有csproj
文件的文件夾中的命令行上:
dotnet publish -r win-x64 -p:PublishSingleFile=true
有關更多詳細信息,請參閱 Gopi 給出的一個很好的答案。
Warp
(感謝 Darien Shannon 在評論中提到它)和dotnet CoreRT
。 兩者都適用於以前版本的 .Net Core
它是一個類似於經典.NET Framework
ILMerge的工具。 這是非常容易使用。 對於基本的控制台應用程序,它可以在不使用搖樹器的情況下生成約 35 MB 的.exe
搖樹器生成約 10-15 MB 的.exe
。
現在,您可以嘗試使用dotnet CoreRT
項目將應用程序預編譯為本機單文件可執行文件。 我說“嘗試”是因為文檔說:
該項目處於開發的早期階段。
盡管如此,它至少適用於簡單的應用程序。 請參閱此處的示例。 根據其描述,您需要在項目文件夾中運行以下命令:
dotnet new nuget
這會將 nuget.config 文件添加到您的應用程序。 打開文件並在下面的元素中添加以下內容:
<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
然后運行這個:
dotnet add package Microsoft.DotNet.ILCompiler -v 1.0.0-alpha-*
然后運行這個:
dotnet publish -r win-x64 -c release
完成后,您可以在 /bin/x64//netcoreapp2.0/publish/ 下的項目根文件夾中找到本機可執行文件
.NET Core 3.0 之前
dotnet publish -r win-x64 -c Release --self-contained
很好的自我解釋:
所以這是正確的,我們最終得到一個文件夾,其中包含我們的 exe 以及運行它所需的一切,但問題是甚至運行一個 HelloWorld 控制台應用程序都需要一噸。
.NET Core 3.0 之后
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
所有這些都是運行我們的發布命令,但告訴它把它打包在一個文件中。 您會注意到我們不再指定自包含標志。 那是因為假設如果您打包為單個 exe,您將需要它的所有依賴項。 說得通。
一個整潔的exe! 執行此操作時,依賴項被提取到一個臨時目錄,然后從那里運行所有內容。 它本質上是我們之前發布文件夾的 zip 文件! 我玩過幾次,老實說,它確實有效。 沒有什么可說的了。 它只是有效。
文件大小和啟動成本
修改 csproj 並添加 PublishTrimmed = true。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>
現在運行以下命令:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
參考:
Microsoft 的此文檔使用與您使用的相同的dotnet publish -c Release -r win10-x64
,並將其記錄如下(強調):
這將為每個目標平台創建一個發布(而不是調試)版本的應用程序。 生成的文件放置在名為 publish的子目錄中,該子目錄位於項目的 .\\bin\\Release\\netcoreapp1.1 子目錄的子目錄中。 請注意,每個子目錄都包含啟動應用程序所需的完整文件集(應用程序文件和所有 .NET Core 文件)。
與應用程序文件一起,發布過程會發出一個程序數據庫 (.pdb) 文件,其中包含有關應用程序的調試信息。 該文件主要用於調試異常。 您可以選擇不將其與應用程序的文件一起打包。 但是,如果您想調試應用程序的發布版本,您應該保存它。
因此,要部署的正確文件是publish
子目錄中的文件。 該目錄超過 60 MB,因為它包含獨立部署所需的 .NET 核心庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.