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,您必须升级到新的配置系统或手动管理文件。
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>到App1.config文件中以将其保留在包之外。MyApp.exe.config具有生产设置的文件并添加<CopyToPublishDirectory>Always</CopyToPublishDirectory>以将其发布到Publish目录。转换不会运行,因此请确保它包含所需的一切。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 文件提供程序来完成。
| 归档时间: |
|
| 查看次数: |
5310 次 |
| 最近记录: |