【问题标题】:How to stop .Net looking for .config files for my executable如何停止 .Net 为我的可执行文件寻找 .config 文件
【发布时间】:2014-01-27 16:32:03
【问题描述】:

我有一个名为 parser.exe 的程序,它使用一个名为 parser.config 的配置文件(一个 txt 格式;我用 streamreader 阅读它)。由于某些原因,C# 抱怨并且不喜欢这样。

未处理的异常: System.Configuration.ConfigurationErrorsException:配置 系统初始化失败---> System.Configuration.ConfigurationErrors

但是如果我创建了一个名为 parser.exe.config 的文件。仅以下内容应用程序运行良好:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>

为什么会发生这种情况以及如何在没有 parser.exe.config 并将配置名称从 parser.config 更改为 parser.exe.config 的情况下抑制此问题?

【问题讨论】:

  • parser.config 中有什么内容?
  • 一个配置文件。纯文本。它告诉程序要读取/使用什么文件名等。
  • 但它有所有的 xml 节点?它不仅是“Property 1,property 2”,还有键值等?
  • @JohnRyann 请显示一些代码
  • 旁注:我更改了标题,因为您的问题与 C# 无关(除非您碰巧使用 C# 编写托管代码)。随时恢复/改进。

标签: c# .net config


【解决方案1】:

它使用一个名为 parser.config 的配置文件(一个 txt 格式;我用 streamreader 读取它)

没有这个必要。 .NET 已经为application configuration files 提供了一个非常好的框架。只需将app.config 文件添加到您的项目中,Visual Studio 将在您构建时自动创建一个parser.exe.config 文件。
然后,您可以使用 ConfigurationSettings.AppSettings 字典来读取单个配置项 - 或使用更复杂的结构化来进行更复杂的配置。

要为配置部分使用外部配置文件,只需使用app.config 中的configSource 属性:

<configuration>
  <appSettings configSource="parser.config" />
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

parser.config:

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
  <add key="Test" value="This is a test"/>
</appSettings>

为什么会这样?

这就是框架的设计方式 - 默认情况下它会查找 {executable name}.config 文件 - 您可以按照上述说明添加外部配置文件,但我不知道让框架默认寻找一个不同的文件名。

可以将新文件加载到单独的配置对象中:

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = @"parser.config";
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

但是你必须使用 config 实例来访问配置设置:

Console.WriteLine(config.AppSettings.Settings["test"].Value);

而不是

Console.WriteLine(ConfigurationManager.AppSettings["test"]);

但要避免使用默认配置文件名似乎还有很长的路要走。

【讨论】:

  • 是的,这就是我的想法。但是如果我选择 parser.config 怎么办。我怎样才能让 c# 接受呢?
  • 您可以使用外部配置文件进行配置部分。我会修改我的答案。
  • 这意味着我还需要 parser.exe.config 吗?我的目标是消除文件的存在。
  • +1。 @JohnRyann - 一种方法是不完全使用 .Net - C++ 也适用于 Windows 应用程序......只需考虑“.config”与“.exe”或“.dll”相同 - 扩展名由用于特定目的的系统/框架。尝试用众所周知的扩展名命名您自己的不相关文件只会造成混乱。
  • parser.config 只是一个文本文件。我所做的只是用streamreader读取文件。为什么 .NET 对此大惊小怪,而 app.config 涉及其中?真奇怪。如果我将文件更改为 parser.txt 它也会抱怨吗?
【解决方案2】:

您可以告诉 .NET 在另一个文件中查找您的设置,如下所示:

<configuration>
    <appSettings file="parser.config"></appSettings> 
</configuration>

【讨论】:

  • 我应该把配置放在哪里?解析器.exe.config ?这意味着我必须首先拥有 parser.exe.config。我的目标是让我的程序接受我正在使用 parser.config 而不必使用 parser.exe.config
  • 正确 - 您必须拥有 .NET app.config(在您的情况下,“构建”时会重命名为 parser.exe.config。
  • 我想你误会了我。如果我有 parser.exe.config,我的程序运行良好。我的目标是删除该文件的存在并使 c# 接受我只使用 parser.config
  • 不,我理解你的问题,但我想说的是,如果你必须拥有你的文件,那就是这样做的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2013-06-14
  • 2021-08-19
  • 1970-01-01
  • 2013-01-13
  • 2010-11-14
相关资源
最近更新 更多