gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:27:02 28 4
gpt4 key购买 nike

我有一个 .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 文件中,以便用户可以更改值?

最佳答案

精简版

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

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

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


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

添加 Application Configuration File到一个新的 Windows 窗体项目,在 VS 2019 和命令行中都会创建一个 App1.config就 VS 或 .NET Core 而言没有特殊意义的文件。创建 AppName.exe.config实际上需要创建一个新的 AppName.exe.config包含生产设置的文件。

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

这就是麻烦的开始。有 a bug.

对于单文件可执行文件,所有文件都捆绑在一个主机文件中,带有 .exe扩大。当该文件第一次运行时,它将其内容解压缩到 AppData\Local\Temp\.net\ ,在以应用程序命名的新文件夹中。 By design ,应用程序的基本目录应该是主机的 路径,单个 .exe 所在的位置。不幸的是,there's a bug基本目录仍然是包和 .dll 的位置这实际上是由主机运行的。

这就是为什么

System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None).FilePath 

返回 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");

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

关于c# - 使用 .Net Core 3.0 发布独立的 exe 文件并使用 app.config,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431097/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com