Como publicar como um arquivo separado sem ser incluído em um arquivo de execução única

Página atualizada :
Data de criação de página :

Ambiente

Estúdio Visual
  • Visual Studio 2019
Núcleo ASP.NET
  • 3.1

O que é um único arquivo?

Além do arquivo exe, muitas vezes você precisará de um arquivo, como um dll para executar um programa. Você distribuirá vários arquivos e programas.

Agora você pode executar todos os arquivos em um ex, publicando o programa usando o recurso "Criar arquivo único" adicionado do .NET Core 3.0. (O arquivo pdb é um arquivo de informações de depuração, então você não precisa distribuí-lo.)

No entanto, em alguns casos, você pode querer colocar um arquivo de configuração em uma pasta com exe em vez de incluí-lo no exe. Esta seção descreve como fazer isso.

Preparando-se para a saída de arquivo único

Como amostra, a configuração do projeto a seguir deve ser usada para carregar o arquivo TextFile1.txt na inicialização. TextFile1.txt destina-se a ser distribuído com o arquivo exe, por isso faça com que "Build Action: None" e "Copy to Output Directory: Copy to New If New". O conteúdo do TextFile1.txt pode ser arbitrário.

Você pode construir um programa com a suposição de que deseja carregar arquivos que são distribuídos juntos.

No entanto, o arquivo executável em um único arquivo é realmente expandido para uma pasta temporária separada quando é executado. Ao carregar um arquivo em um caminho relativo, você deve especificá-lo na pasta onde você iniciou o arquivo executável, não na pasta onde o arquivo executável está localizado.

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();
    }
  }
}

Quando você depurar, você pode ver que o arquivo está carregado.

TextFile1.txt também é impresso na pasta de saída porque ainda não foi compilado em um único arquivo.

Vamos publicá-lo como um único arquivo neste estado. O procedimento é omitido porque a publicação não se destina.

O tempo de execução do alvo deve ser não portátil para ser um único arquivo.

Ainda não marquei nada, então é um arquivo como sempre.

Não há textFile1.txt quando você executá-lo, então você terá um erro.

Como publicar um arquivo específico sem incluí-lo em um único arquivo

Abra o arquivo do projeto (csproj) em código com o arquivo que você não deseja incluir no projeto.

Eu acho que é xml assim: Procure o arquivo para o qual deseja alterar as configurações. Dependendo das configurações do seu projeto, você pode não ter um arquivo de destino, então você pode precisar adicioná-lo manualmente.

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

Ao encontrar o arquivo, adicione ExcludeFromSingleFile com verdade, da seguinte forma: Como o nome indica, ele é excluído de um único arquivo.

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

Por favor, tente publicar uma vez que você tenha salvo. Você pode ver que ele é publicado a partir de um único arquivo.

Você ainda pode executar o arquivo publicado para verificar se ele está funcionando corretamente.