.NET 5无法编译为单文件可执行文件

26

我遇到了一个问题,即在通过Visual Studio进行调试时尝试将我的.NET 5应用程序编译为单个文件可执行文件。

我的.csproj文件如下所示。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net50</TargetFramework>
    <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishSingleFile>true</PublishSingleFile>
    <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

</Project>

我已将我的运行时标识符设置为winx64并将发布单个文件设置为true,但在构建时,我的应用程序使用的一堆DLL都会与它一起构建(总共272个)。我想知道 - 我该如何将这些DLL打包到该应用程序中?我曾以为将其作为单个文件可执行文件发布已经可以做到了。

EXE旁边的DLL图片


3
似乎你正在查看构建输出而不是发布输出。尝试运行 dotnet publish 命令,然后应用参数 PublishSingleFile。 - J.Loscos
有没有办法在生成的输出中使publishsinglefile工作? - FeroxFoxxo
由于发布不支持原地操作,它需要某种中间目录。这就是为什么发布输出必须与构建输出不同的原因。在您运行 dotnet publish(如J.Loscos所建议)后,您的发布输出文件夹是什么样子的? - CodeFox
请查看 https://github.com/dotnet/designs/blob/main/accepted/2020/single-file/design.md#user-experience(一份描述.NET 5.0中单文件应用程序设计的文档)。 - Stefano Spinucci
哎呀,很遗憾它不允许单文件可执行文件在构建时工作。我想没有什么捷径能绕过这个问题了吧? - FeroxFoxxo
2个回答

49

对于 .NET 5,在发布项目时获取单个可运行的可执行文件,重要的属性是:

  • PublishSingleFile
  • SelfContained
  • IncludeAllContentForSelfExtract
  • RuntimeIdentifier

您需要将它们包含在项目文件中或在命令行上指定。

项目文件:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <!--<OutputType>WinExe</OutputType>--><!--Use this for WPF or Windows Forms apps-->
        <TargetFramework>net5.0</TargetFramework>
        <!--<TargetFramework>net5.0-windows</TargetFramework>--><!--Use this for WPF or Windows Forms apps-->
        <PublishSingleFile>true</PublishSingleFile>
        <SelfContained>true</SelfContained>
        <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier><!--Specify the appropriate runtime here-->
    </PropertyGroup>

</Project>

CLI:

dotnet publish -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeAllContentForSelfExtract=true

根据您的需求,还有一些值得考虑的其他属性,例如:

  • PublishTrimmed
  • PublishReadyToRun

请参阅此处的文档页面:

https://learn.microsoft.com/en-us/dotnet/core/deploying/single-file https://github.com/dotnet/designs/blob/main/accepted/2020/single-file/design.md


1
如果您有COM引用,则使用dotnet的CLI版本无法正常工作。然后,如果在终端中执行发布操作,则应使用MSBuild.exe。 - R13mus
10
我的项目文件缺失一行代码:<IncludeAllContentForSelfExtract>。通过VS UI设置发布时不包括参数IncludeAllContentForSelfExtract,需要在FolderProfile.pubxml文件中手动添加该行代码才能完成神奇的步骤。 - Moon Waxing
请注意,IncludeAllContentForSelfExtract 会使其提取所有内容,因此它的行为类似于 .NET Core 3.1。如果您试图避免临时目录被部分删除,这可能是不可取的,因为 .NET 5 仅提取本机库。 - Mgamerz
使用此控制台命令在使用发布向导时无法解决问题(它在net 3.1中对我有效,但在net 5中不再有效)。 - Welcor
1
所有这些选项仍然会生成少量文件。我想为我的控制台程序制作一个小的单一EXE文件。 - nim
有没有一种方法可以在项目文件中自动完成这个过程?我问这个问题的原因是,这些说明似乎在说“接受项目文件输出DLL。打开命令提示符并键入此dotnet神秘咒语以获取.EXE文件。”有没有一种方法可以让项目文件直接生成.EXE而不必手动运行dotnet步骤? - Benilda Key

1

我曾遇到类似的问题,这个问题发生在将单文件应用程序从 .Net Core 3.1 升级到 .Net 6 时,应用程序在启动后立即退出。解决方法是在发布命令中添加以下设置:

/p:IncludeAllContentForSelfExtract=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接