使用 .Net Core 3.0 并使用 app.config 发布独立的 exe 文件

J. *_*Doe 11 c# app-config .net-core

我有一个 .Net Core 3.0 项目,想利用新选项将项目发布为单个 .exe 文件。

我使用命令
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

果然,这产生了一个 .exe 文件,但问题是我的项目中有一个 app.config 文件,用户应该修改它,我不确定它是否也打包在 .exe 中。当我测试生成的 .exe 时,它​​会读取我最初放在 app.config 中的值。

我曾尝试将“复制到输出目录”选项设置为“始终复制”,但这没有任何改变。“构建操作”设置为“无”。

如何设置它以便除 app.config 之外的所有内容都打包在该 .exe 文件中,以便用户可以更改值?

Pan*_*vos 12

精简版

.NET Core 不使用app.config,您必须升级到新的配置系统或手动管理文件。

  1. 添加<ExcludeFromSingleFile>true</ExcludeFromSingleFile>App1.config文件中以将其保留在包之外。
  2. 手动添加MyApp.exe.config具有生产设置的文件并添加<CopyToPublishDirectory>Always</CopyToPublishDirectory>以将其发布到Publish目录。转换不会运行,因此请确保它包含所需的一切。
  3. 最后显式加载文件以避免应用程序的基本路径解析中的错误
var hostFile=Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
ConfigurationManager.OpenExeConfiguration(hostFile+".config");
Run Code Online (Sandbox Code Playgroud)

加载已发布的文件,就好像它是任何其他文件一样


.NET Core 3,即使对于 Windows 窗体,也不使用app.config. .NET Core 的配置系统在 ASP.NET Core中的配置中进行了描述,尽管名称如此,但它适用于每个 .NET Core 应用程序。它也更强大,从多个来源加载配置,包括文件(甚至 INI)、数据库、Azure 或 AWS 设置存储等。

添加一个Application Configuration File在VS 2019到新的Windows窗体项目,两者的命令行创建一个App1.config没有特殊含义的,只要VS或.NET的核心关注文件。创建一个AppName.exe.config实际需要AppName.exe.config使用生产设置创建一个新文件。

读取旧式.config文件的唯一方法是使用ConfigurationManager.OpenExeConfiguration显式加载它。这只是加载文件并解析它。可以传递任何文件路径,或指定一个 ConfigurationUserLevel,它只是根据可执行文件的基本目录解析为文件位置。

这就是麻烦开始的地方。有一个错误。

对于单文件可执行文件,所有文件都捆绑在一个带有.exe扩展名的主机文件中。当该文件第一次运行时,它会将其内容解压到AppData\Local\Temp\.net\, 以应用程序命名的新文件夹中。按照设计,应用程序的基目录应该是主机的路径,即单个 .exe 所在路径。不幸的是,有一个错误,基本目录仍然是包的位置,而.dll实际上是由主机运行的。

这就是为什么

System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None).FilePath 
Run Code Online (Sandbox Code Playgroud)

回报C:\Users\myUser~1\AppData\Local\Temp\.net\ConsoleApp_NetCore\nk5sdmz5.ym1\ConsoleApp_NetCore.dll.config,我敢打赌AppContext.BaseDirectory回报C:\Users\myUser~1\AppData\Local\Temp\.net\ConsoleApp_NetCore\nk5sdmz5.ym1\

解决方法这是检索主机的路径和明确加载设置文件。这意味着我们现在可以使用任何文件名。如果我们保留命名文件的旧约定appname.exe.config,我们可以附加.config到主机的完整路径:

var hostFile=Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
ConfigurationManager.OpenExeConfiguration(hostFile+".config");
Run Code Online (Sandbox Code Playgroud)

这也必须通过 .NET Core 文件提供程序来完成。