无法从 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" />
是<configSections>
为什么要声明两次自定义部分? <connectionConfig portNumber="7777" hostName="localhost" />
是使用自定义部分的正确方式。
type
属性上的 <section name ="connectionConfig" type="ConnectionManager.MyConnectionConfigurationSection" />
应提供类的完整程序集限定名称。也就是说,如果你的程序集被称为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# 中的控制台应用程序中读取配置文件的主要内容,如果未能解决你的问题,请参考以下文章
无法从使用 Azure SAML SSO 配置的本地应用程序中的 C# 中的 Request.Params 获取 SAML 响应