Cómo publicar como un archivo independiente sin incluirse en un archivo de ejecución única

Actualización de la página :
Fecha de creación de la página :

Ambiente

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3.1

¿Qué es un solo archivo?

Además del archivo exe, a menudo necesitará un archivo como un archivo dll para ejecutar un programa. Distribuirá varios archivos y programas.

Ahora puede ejecutar todos los archivos en un solo archivo publicando el programa mediante la característica "Crear archivo único" agregada desde .NET Core 3.0. (El archivo pdb es un archivo de información de depuración, por lo que no tiene que distribuirlo.)

Sin embargo, en algunos casos, es posible que desee colocar un archivo de configuración en una carpeta con exe en lugar de incluirlo en el archivo exe. En esta sección se describe cómo hacerlo.

Preparación para la salida de un solo archivo

Como ejemplo, se debe usar la siguiente configuración del proyecto para cargar el archivo TextFile1.txt al inicio. TextFile1.txt está pensado para distribuirse con el archivo exe, así que hazlo "Build Action: None" y "Copy to Output Directory: Copy to New If New." El contenido de TextFile1.txt puede ser arbitrario.

Puede crear un programa con la suposición de que desea cargar archivos que se distribuyen juntos.

Sin embargo, el archivo ejecutable en un único archivo se expande realmente a una carpeta temporal independiente cuando se ejecuta. Al cargar un archivo en una ruta de acceso relativa, debe especificarlo en la carpeta donde inició el archivo ejecutable, no en la carpeta donde se encuentra el archivo ejecutable.

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

Al depurar, puede ver que se carga el archivo.

TextFile1.txt también se imprime en la carpeta de salida porque aún no se ha compilado en un solo archivo.

Vamos a publicarlo como un único archivo en este estado. El procedimiento se omite porque la publicación no está pensada.

El tiempo de ejecución de destino debe ser no portátil para que sea un único archivo.

Todavía no he establecido nada, así que es un archivo como de costumbre.

No hay ningún TextFile1.txt cuando se ejecuta, por lo que obtendrá un error.

Cómo publicar un archivo específico sin incluirlo en un solo archivo

Abra el archivo de proyecto (csproj) en el código con el archivo que no desea incluir en el proyecto.

Creo que es xml así: Busque el archivo para el que desea cambiar la configuración. Dependiendo de la configuración del proyecto, es posible que no tenga un archivo de destino, por lo que es posible que deba agregarlo 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>

Cuando encuentre el archivo, agregue ExcludeFromSingleFile con true, como se indica a continuación: Como su nombre indica, se excluye de un único archivo.

<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, intente publicar una vez que haya guardado. Puede ver que se publica desde un solo archivo.

Todavía puede ejecutar el archivo publicado para comprobar que funciona correctamente.