C# 如何停止.Net为我的可执行文件查找.config文件

C# 如何停止.Net为我的可执行文件查找.config文件,c#,.net,config,C#,.net,Config,我有一个名为parser.exe的程序,它使用一个名为parser.config的配置文件(txt格式;我使用streamreader读取)。出于某些原因,C#抱怨并不喜欢这样 未处理的异常: System.Configuration.ConfigurationErrors异常:配置 系统初始化失败---> System.Configuration.ConfigurationErrors 但是如果我创建了一个名为parser.exe.config的文件。通过以下内容,应用程序运行良好: <

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

未处理的异常: System.Configuration.ConfigurationErrors异常:配置 系统初始化失败---> 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的配置文件(txt格式;我使用streamreader读取)

没有这个必要。NET已经有了一个非常好的框架。只需将
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>
<?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的配置文件(txt格式;我使用streamreader读取)

没有这个必要。NET已经有了一个非常好的框架。只需将
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>
<?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"]);

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

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

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

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

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



parser.config中有什么?一个配置文件。纯文本。它告诉程序要读取/使用的文件名等,但它有所有xml节点吗?它不仅是“属性1,项目2”,而且是键值等@JohnRyann展示一些代码请注意:我已经更改了标题,因为您的问题与C#没有特别的关系(除了您碰巧使用C#编写托管代码)。请随意还原/improve.parser.config中有什么?一个配置文件。纯文本。它告诉程序要读取/使用的文件名等,但它有所有xml节点吗?它不仅是“属性1,项目2”,而且是键值等@JohnRyann展示一些代码请注意:我已经更改了标题,因为您的问题与C#没有特别的关系(除了您碰巧使用C#编写托管代码)。请随时回复/改进。是的,这就是我的想法。但是如果我选择parser.config呢。我怎样才能让c#接受这一点呢?您可以使用外部配置文件进行配置部分。我将修改我的答案。这意味着我仍然需要parser.exe.config?我的目标是消除文件的存在。+1@一种方法是不使用.NET完全-C++对于Windows应用程序来说也是完美的…只需考虑“.CONFIG”与“.exe”或“.dll”相同的扩展——系统/框架为特定目的保留的扩展。尝试用已知扩展名命名自己的无关文件只会造成混乱。parser.config只是一个文本文件。我所做的只是用streamreader读取文件。为什么.NET对此大惊小怪,而app.config却牵涉其中?这很奇怪。如果我把这个文件改成parser.txt,它还会抱怨吗?是的,我就是这么想的。但是如果我选择parser.config呢。我怎样才能让c#接受这一点呢?您可以使用外部配置文件进行配置部分。我将修改我的答案。这意味着我仍然需要parser.exe.config?我的目标是消除文件的存在。+1@一种方法是不使用.NET完全-C++对于Windows应用程序来说也是完美的…只需考虑“.CONFIG”与“.exe”或“.dll”相同的扩展——系统/框架为特定目的保留的扩展。尝试用已知扩展名命名自己的无关文件只会造成混乱。parser.config只是一个文本文件。我所做的只是用streamreader读取文件。为什么.NET对此大惊小怪,而app.config却牵涉其中?这很奇怪。如果我将文件更改为parser.txt,它还会抱怨吗?我应该将配置放在哪里?parser.exe.config?这意味着首先必须有parser.exe.config