如何作为单独的文件发布,而不是包含在作为单个可执行文件发布的文件中

更新页 :
页面创建日期 :

环境

Visual Studio
  • Visual Studio 2019
ASP.NET 核心
  • 3.1

什么是单个文件?

通常,除了 exe 文件之外,还需要 dll 等文件才能运行程序。 程序分发涉及多个文件和分发。

通过使用 .NET Core 3.0 添加的功能"创建单个文件"发布程序,现在可以将所有文件一起运行到单个 exe 中。 (pdb 文件是调试信息文件,因此无需分发)

但是,在某些情况下,您可能希望将配置文件放在 exe 的文件夹中,而不是包含在 exe 中。 下面介绍如何操作。

准备单个文件输出

例如,假设您有一个项目配置,并在启动时加载 TextFile1.txt 文件。 由于 TextFile1.txt 假定与 exe 文件一起分发,因此应将其设置为"生成操作:"和"复制到输出目录:如果是新文件,则复制"。 TextFile1.txt 的内容可以是任何内容。

您可以编写程序,假定程序将加载一起分发的文件。

但是,单个文件的可执行文件实际上在运行它时将部署到另一个临时文件夹。 在相对路径中加载文件时,必须指定可执行文件启动的文件夹,而不是包含可执行文件的文件夹。

using System;
using System.Diagnostics;
using System.IO;

namespace ExcludeFromSingleFile
{
  class Program
  {
    static void Main(string[] args)
    {
      using var processModule = Process.GetCurrentProcess().MainModule;
      Console.WriteLine(File.ReadAllText(Path.Combine(Path.GetDirectoryName(processModule.FileName), "TextFile1.txt")));
      Console.ReadKey();
    }
  }
}

调试运行时,您可以看到文件已加载。

由于尚未在单个文件中,因此 TextFile1.txt 也输出到输出文件夹。

现在,让我们将此状态作为单个文件发布。 由于发布说明不是目的,因此省略了该过程。

目标运行时必须是可移植的,才能成为单个文件。

还没有设置任何东西,所以像往常一样,它成为一个文件。

运行时,没有 TextFile1.txt,这会导致错误。

如何在不包含在单个文件中发布特定文件

在项目中包含不想包含在单个文件中的文件时,在代码中打开项目文件 (csproj)。

我认为XML如下所示。 查找要更改其设置的文件。 根据项目的设置,您可能没有目标文件,因此您需要手动添加这些文件。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <None Update="TextFile1.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

找到目标文件后,将ExcludeFromSingleFile添加到true中,如下所示: 顾名思义,这意味着从单个文件中排除它。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <None Update="TextFile1.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <!-- ここから追加 -->
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
      <!-- ここまで追加 -->
    </None>
  </ItemGroup>
</Project>

保存后,请尝试发布它。 您可以看到,它已从单个文件中排除并发布。

您可以验证已发布的文件是否正常工作。