无法从 C# 中的控制台应用程序中读取配置文件

Posted

技术标签:

【中文标题】无法从 C# 中的控制台应用程序中读取配置文件【英文标题】:Unable to read from config file in console app in c# 【发布时间】:2014-08-08 08:26:45 【问题描述】:

我试图在 Visual Studio 2012 的项目中从 app.config 文件中读取两个变量。但是我得到一个异常:“配置系统初始化失败”。有什么想法吗?

这是我的 app.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <configurationSections>
    <section name ="connectionConfig" type="ConnectionManager.MyConnectionConfigurationSection"
             />
  </configurationSections>
  <connectionConfig  portNumber="7777"/>
  <connectionConfig  hostName="localhost" />
</configuration>

C# 文件:

          namespace ConnectionManager
            
                public class MyConnectionConfigurationSection : System.Configuration.ConfigurationSection
                
                    [ConfigurationProperty("portNumber")]
                    public string PortNumber
                    
                        get
                        
                            return (string)this["portNumber"];
                        
                    set
                    
                        this["portNumber"] = value;
                    
                

                [ConfigurationProperty("hostName")]
                public string HostName
                
                    get
                    
                        return (string)this["hostName"];
                    
                    set
                    
                        this["hostName"] = value;
                    
                
            

            public static class ConnectionApplication
            
                public static MyConnectionConfigurationSection Config  get; internal set; 

                public static void Initialize()
                
                    try
                    
                        Config = ConfigurationManager.GetSection("connectionConfig") as MyConnectionConfigurationSection ;
                    
                    catch (Exception ex)
                    
                        Console.WriteLine(ex.Message.ToString());
                    

                

            
    class Program
        
            static string portNumber;
            static string hostName;
            static void Main(string[] args)
            
                ConnectionApplication.Initialize();

                portNumber=ConnectionApplication.Config.PortNumber;
                Console.WriteLine(portNumber);

                hostName = ConnectionApplication.Config.HostName;
                Console.WriteLine(hostName);

            
        

似乎它无法初始化...当我转储异常时,异常显示:配置系统初始化失败。任何建议我做错了什么

【问题讨论】:

您已将PortNumber 属性声明为string,并在Program 类中将portNubmer 声明为int 抱歉打错了...现在更正 【参考方案1】:

再次检查您的代码:

  <configurationSections>
    <section name ="connectionConfig" type="ConnectionManager.MyConnectionConfigurationSection"
             />
  </configurationSections>
  <connectionConfig  portNumber="7777"/>
  <connectionConfig  hostName="localhost" />
&lt;configSections&gt; 为什么要声明两次自定义部分? &lt;connectionConfig portNumber="7777" hostName="localhost" /&gt; 是使用自定义部分的正确方式。 type 属性上的 &lt;section name ="connectionConfig" type="ConnectionManager.MyConnectionConfigurationSection" /&gt; 应提供类的完整程序集限定名称。也就是说,如果你的程序集被称为ConnectionManager,你应该配置ConnectionManager.MyConnectionConfigurationSection, ConnectionManager

顺便说一句,在我看来,如果您要配置 2 个简单的设置,我不会使用自定义配置部分(这是一种矫枉过正)。为什么不直接使用 .NET 配置模型中内置的appSettings

<appSettings>
     <add key="connectionManager:host" value="localhost" />
     <add key="connectionManager:port" value="7777" />
</appSettings>

您将通过这种方式访问​​这些参数:

string host ConfigurationManager.AppSettings["connectionManager:host"];
int port = int.Parse(ConfigurationManager.AppSettings["connectionManager:port"]);

【讨论】:

实际上我正在尝试学习自定义配置,因此只是在玩……感谢您的建议 @为什么我很高兴这解决了你的问题。从 .NET 早期开始,我就一直在使用自定义配置部分,这是一种非常强大的方法,因为您获得了一个类型化的配置模型,并且您不需要在自己的配置验证引擎上浪费时间...... +1 提供解决 OP 问题的答案 :) @CloudyMarble 谢谢!【参考方案2】:

检查您的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <configurationSections>
        <section name ="connectionConfig" type="ConnectionManager.MyConnectionConfigurationSection"/>
    </configurationSections>
    <connectionConfig  portNumber="7777"/>
    <connectionConfig  hostName="localhost" />
</configuration>

包含端口号和主机名的部分超出了您在代码中阅读的部分。

试试这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <configurationSections>
        <section name ="connectionConfig" type="ConnectionManager.MyConnectionConfigurationSection">        
          <connectionConfig  portNumber="7777"/>
          <connectionConfig  hostName="localhost" />
        </section>
    </configurationSections>
</configuration>

【讨论】:

不,我提供了一个问题可能出在哪里的想法。 我相信你的代码行不通。也许我完全错了,但这不是 .NET 配置架构 也许我自己弄错了,但我相信你的回答是错误的,当我试图理解你为什么得到正面投票时,我很难理解。这不是 OP 要求的标准 .NET 配置模型。 你可能是对的,但它并不总是关于可编译代码,一个想法也是一种帮助人们的选择,不是吗,正如我提到的,我不确定它是否能解决问题,但它只是一个想法. 不要理解我的错误,任何答案都可能会有所帮助,即使它不能解决问题。我担心你不明白,因为 .NET 配置模型不是基于意见的问题。它遵循 XML 模式,并被反序列化为对象模型。我的意思是,您的回答会造成混淆,因为这不是自定义 XML 配置。您的代码会抛出与 OP 代码相同的异常!! :D

以上是关于无法从 C# 中的控制台应用程序中读取配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个项目中从 C# 中的多个配置文件中读取值?

从外部配置文件中读取连接字符串

C# SQL链接字符串的配置与读取

c#如何读取配置文件中的信息

无法从数据流中的 GCS 读取我的配置文本文件(列名)

无法从使用 Azure SAML SSO 配置的本地应用程序中的 C# 中的 Request.Params 获取 SAML 响应