如何配置自包含的单文件程序?

SET*_*SET 5 c# .net-core

我正在尝试.Net Core 3修剪单文件发布,创建一个简单的控制台应用程序并使用它来发布:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true
Run Code Online (Sandbox Code Playgroud)

配置是使用标准appsettings.jsonConfigurationBuilder来自Microsoft.Extensions.Configuration.Json.

问题是配置文件与整个应用程序打包在一起,因此不可用 - 它可以在运行程序时创建的临时目录中访问,但这对普通用户来说不是很有用。

我发现您可以通过编辑 csproj 文件或使用自定义发布配置文件从打包过程中排除文件

<ItemGroup>
    <None Update="appsettings.json">
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

这确实在发布目录中输出 appsettings 文件,但是在运行应用程序时不使用它 - 创建并使用一个空的配置文件。有什么办法可以“正确地”做到这一点,因为文档在这个问题上有点缺乏,或者我应该手动解析我希望位于起始目录中的文件(这本身很难找到,因为Assembly.Get###Assembly都返回了临时目录) ?

小智 4

我发现在 AddJsonFile() 之前将其添加到 ConfigurationBuilder() 似乎可以解决问题:

   .SetBasePath(Environment.CurrentDirectory)
Run Code Online (Sandbox Code Playgroud)

IE:

var configurationRoot = new ConfigurationBuilder()
        .SetBasePath(Environment.CurrentDirectory)
        .AddJsonFile("appSettings.json", optional: false)
        .Build();
Run Code Online (Sandbox Code Playgroud)