Come pubblicare come file separato senza essere inclusi in un file a esecuzione singola

Pagina aggiornata :
Data di creazione della pagina :

Ambiente

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

Che cos'è un singolo file?

Oltre al file exe, è spesso necessario un file come una dll per eseguire un programma. Distribuirai più file e programmi.

È ora possibile eseguire tutti i file in un unico exe pubblicando il programma utilizzando la funzionalità "Crea file singolo" aggiunto da .NET Core 3.0. Il file pdb è un file di informazioni di debug, pertanto non è necessario distribuirlo.

Tuttavia, in alcuni casi, è possibile inserire un file di configurazione in una cartella con exe anziché includerlo nel file exe. In questa sezione viene descritto come eseguire questa operazione.

Preparazione per l'output a file singolo

Come esempio, la configurazione di progetto seguente deve essere utilizzata per caricare il file TextFile1.txt all'avvio. TextFile1.txt deve essere distribuito con il file exe, quindi impostarlo su "Operazione di compilazione: Nessuna" e "Copia nella directory di output: copia in nuovo se nuovo". Il contenuto di TextFile1.txt può essere arbitrario.

È possibile compilare un programma presupponendo che si desidera caricare i file distribuiti insieme.

Tuttavia, il file eseguibile in un singolo file viene effettivamente espanso in una cartella temporanea separata quando viene eseguito. Quando si carica un file in un percorso relativo, è necessario specificarlo nella cartella in cui è stato avviato il file eseguibile, non nella cartella in cui si trova il file eseguibile.

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 si esegue il debug, è possibile vedere che il file viene caricato.

TextFile1.txt viene stampato anche nella cartella di output perché non è ancora stato compilato in un singolo file.

Pubblichiamolo come un singolo file in questo stato. La procedura viene omessa perché la pubblicazione non è prevista.

Il runtime di destinazione deve essere non portabile per essere un singolo file.

Non ho ancora impostato nulla, quindi è un file come al solito.

Non vi è alcun TextFile1.txt quando lo si esegue, in modo da ottenere un errore.

Come pubblicare un file specifico senza includerlo in un singolo file

Aprire il file di progetto (csproj) nel codice con il file che non si desidera includere nel progetto.

Penso che sia xml come questo: Cercare il file per il quale si desidera modificare le impostazioni. A seconda delle impostazioni del progetto, potrebbe non essere presente un file di destinazione, pertanto potrebbe essere necessario aggiungerlo 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>

Quando si trova il file, aggiungere ExcludeFromSingleFile con true, come indicato di seguito: Come il nome implica, è escluso da un singolo file.

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

Si prega di provare a pubblicare una volta che hai salvato. Si può vedere che è pubblicato da un singolo file.

È comunque possibile eseguire il file pubblicato per verificare che funzioni correttamente.