簡體   English   中英

將 .NET Core 應用程序發布為可移植的可執行文件

[英]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 文件。

我有一些問題:

  • PE 應用程序需要哪一個exe文件(在發布文件夾內/外)?
  • 為什么當我剪切exe文件並將其移動到其他地方時它不運行(沒有消息)?
  • 如果我需要所有dll文件來運行應用程序,那么我有兩個選項(內部/外部發布文件夾),內部發布文件夾大小為 66 MB,但外部發布文件夾大小為 1 MB。
  • 我想要一個exe文件來運行我的程序而沒有 dll 文件。

文件夾大小圖像

.NET 核心 3.0

.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

點網核心RT

現在,您可以嘗試使用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

很好的自我解釋:

  • 從當前目錄發布項目。
  • 構建項目以在 Windows 64 位機器上運行。
  • 在發布配置模式下構建
  • 將所有內容發布為“自包含”,以便運行應用程序所需的所有內容都與我們的可執行文件打包在一起

所以這是正確的,我們最終得到一個文件夾,其中包含我們的 exe 以及運行它所需的一切,但問題是甚至運行一個 HelloWorld 控制台應用程序都需要一噸。

發布文件夾

.NET Core 3.0 之后

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

所有這些都是運行我們的發布命令,但告訴它把它打包在一個文件中。 您會注意到我們不再指定自包含標志。 那是因為假設如果您打包為單個 exe,您將需要它的所有依賴項。 說得通。

發布文件夾

一個整潔的exe! 執行此操作時,依賴項被提取到一個臨時目錄,然后從那里運行所有內容。 它本質上是我們之前發布文件夾的 zip 文件! 我玩過幾次,老實說,它確實有效。 沒有什么可說的了。 它只是有效。

文件大小和啟動成本

  • 敏銳的眼睛會注意到上面截圖的一些東西。 文件大小。 超過70MB! 對於一個只在屏幕上打印 Hello World 的應用程序來說,這太瘋狂了! 這在 .NET Core 3.0 的 Preview 6 中得到了解決,其中有一項稱為 IL Linker 或 Publish trimmer 的功能,該功能省略了未使用的 DLL。
  • 您可能會發現的另一個問題是,第一次運行自包含的可執行文件時會產生輕微的啟動成本。 因為它需要在第一次運行時將所有依賴項基本上解壓縮到一個臨時目錄,所以這需要一點時間來完成。 這並不瘋狂(5 秒左右),但很明顯。 幸運的是,在隨后的運行中,它使用了這個已經解壓縮的臨時文件夾,因此可以立即啟動。

修改 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

參考

  1. https://dotnetcoretutorials.com/2019/06/20/publishing-a-single-exe-file-in-net-core-3-0/
  2. https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfcontainedSingleExecutable.aspx

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM