2

我有一个非常简单的应用程序,我试图使用设置属性来构建app.config。 app.config是构建的,但运行时,键不会检索值。内置设置时无法访问App.config设置

我原本用于该项目的应用程序配置文件的添加和手建设取得了巨大成功在app.config手工打造的app.config低于:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <appSettings> 
    <add key="Hosppath" value="C:\events\inbound"/> 
    <add key="Vendpath" value="C:\events\outbound"/> 
    <add key="Hospname" value="OBLEN_COB_Active_Inv_Advi_Daily_.csv"/> 
    <add key="Vendname" value="Advi_OBlen_Active_Inv_Ack_Daily_.csv"/> 
    <add key="Hospkey" value="invoice_number"/> 
    <add key="Vendkey" value="invoice"/> 
    <add key="Outpath" value="C:\events\Reports"/> 
    <add key="Outname" value="OB_Exception_Report_.xlsx"/> 
    <add key="Hospexcpt" value="O'Bleness Exceptions"/> 
    <add key="Vendexcpt" value="AdviCare Exceptions"/> 
    </appSettings> 
</configuration> 

调用类是这里:

using System; 
using System.Configuration; 

namespace LoadSettings 
{ 
    public static class ConfigReader 
    { 
     public static bool ReadAllSettings() 
     { 
      var success = false; 
      var appSettings = ConfigurationManager.AppSettings; 

      if(appSettings.Count > 0) 
      { 
       success = true; 
      } 
      return success; 
     } 

     public static string ReadSetting(string key) 
     { 
      string result = ""; 

      var appSettings = ConfigurationManager.AppSettings; 
      result = appSettings[key] ?? "Not Found"; 

      return result; 
     } 
    } 
} 

在main()函数如下:

using System; 
using System.Configuration; 

namespace LoadSettings 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string hospPath; 
      string vendPath; 
      string hospName; 
      string vendName; 
      string hospKey; 
      string vendKey; 
      string rptPath; 
      string rptName; 
      string sht1Name; 
      string sht2Name; 

      if (ConfigReader.ReadAllSettings()) 
      { 
       hospPath = ConfigReader.ReadSetting("Hosppath"); 
       vendPath = ConfigReader.ReadSetting("Vendpath"); 
       hospName = ConfigReader.ReadSetting("Hospname"); 
       vendName = ConfigReader.ReadSetting("Vendname"); 
       hospKey = ConfigReader.ReadSetting("Hospkey"); 
       vendKey = ConfigReader.ReadSetting("Vendkey"); 
       rptPath = ConfigReader.ReadSetting("Outpath"); 
       rptName = ConfigReader.ReadSetting("Outname"); 
       sht1Name = ConfigReader.ReadSetting("Hospexcpt"); 
       sht2Name = ConfigReader.ReadSetting("Vendexcpt"); 

       Console.WriteLine("The hospital file path is:  {0}", hospPath); 
       Console.WriteLine("The vendor file path is:  {0}", vendPath); 
       Console.WriteLine("The hospital file name is:  {0}", hospName); 
       Console.WriteLine("The vendor file name is:  {0}", vendName); 
       Console.WriteLine("The hospital key field is:  {0}", hospKey); 
       Console.WriteLine("The vendor key field is:  {0}", vendKey); 
       Console.WriteLine("The exceptions report path is: {0}", rptPath); 
       Console.WriteLine("The exceptions report name is: {0}", rptName); 
       Console.WriteLine("The sheet1 tab name is:   {0}", sht1Name); 
       Console.WriteLine("The sheet2 tab name is:   {0}", sht2Name); 
      } 
     } 
    } 
} 

这就像一个冠军,但只要我尝试在设置中创建它,我就没有收回任何东西。下面是设置:

Settings image

所创建的app.config看起来完全正常的:

Renamed to proper application_name.exe.config name

内部,内容匹配放置在设置中的键和值:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="OHS_RCIS.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="OHS_RCIS.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <OHS_RCIS.Properties.Settings> 
      <setting name="Hospkey" serializeAs="String"> 
       <value>invoice_number</value> 
      </setting> 
      <setting name="Vendkey" serializeAs="String"> 
       <value>invoice</value> 
      </setting> 
      <setting name="Column2" serializeAs="String"> 
       <value>curr_tot_acct_bal</value> 
      </setting> 
      <setting name="Column3" serializeAs="String"> 
       <value>COL_AGNCY_NAME</value> 
      </setting> 
      <setting name="Column4" serializeAs="String"> 
       <value>admit_date</value> 
      </setting> 
      <setting name="Column5" serializeAs="String"> 
       <value>discharge_date</value> 
      </setting> 
      <setting name="Column6" serializeAs="String"> 
       <value>create_date</value> 
      </setting> 
      <setting name="Column7" serializeAs="String"> 
       <value>HSP_ACCOUNT_ID</value> 
      </setting> 
      <setting name="Outpath" serializeAs="String"> 
       <value>C:\events\Reports</value> 
      </setting> 
      <setting name="Outname" serializeAs="String"> 
       <value>COB_OB_Advi_Placement_Exceptions_.xlsx</value> 
      </setting> 
      <setting name="Hospexcpt" serializeAs="String"> 
       <value>O\'Bleness Exceptions</value> 
      </setting> 
      <setting name="Vendexcpt" serializeAs="String"> 
       <value>AdviCare Exceptions</value> 
      </setting> 
      <setting name="Tab1Color" serializeAs="String"> 
       <value>FFFFE1FF</value> 
      </setting> 
      <setting name="Tab2Color" serializeAs="String"> 
       <value>FFE4E1FF</value> 
      </setting> 
      <setting name="ColumnCount" serializeAs="String"> 
       <value>7</value> 
      </setting> 
     </OHS_RCIS.Properties.Settings> 
    </userSettings> 
    <applicationSettings> 
     <OHS_RCIS.Properties.Settings> 
      <setting name="Hosppath" serializeAs="String"> 
       <value>C:\events\inbound</value> 
      </setting> 
      <setting name="Vendpath" serializeAs="String"> 
       <value>C:\events\outbound</value> 
      </setting> 
      <setting name="Hospname" serializeAs="String"> 
       <value>O\'Bleness Exceptions</value> 
      </setting> 
      <setting name="Vendname" serializeAs="String"> 
       <value>AdviCare Exceptions</value> 
      </setting> 
     </OHS_RCIS.Properties.Settings> 
    </applicationSettings> 
</configuration> 

用于访问app.config的代码看起来像这样,一些添加的行尝试哄结果S:

using System; 
using System.Configuration; 

namespace OHS_RCIS.Utility 
{ 
    public static class ConfigReader 
    { 
     public static bool ReadAllSettings() 
     { 
      var success = false; 
      ConfigurationManager.GetSection("userSettings"); 
      ConfigurationManager.RefreshSection("userSettings"); 
      var appSettings = ConfigurationManager.AppSettings; 

      if (appSettings.Count > 0) 
      { 
       success = true; 
      } 
      return success; 
     } 

     public static string ReadSetting(string key) 
     { 
      string result = ""; 

      var appSettings = ConfigurationManager.AppSettings; 
      result = appSettings[key] ?? "Not Found"; 

      return result; 
     } 
    } 
} 

The calls where it fails in Main()

我显然缺少的东西通过设置完成时,但有适当的引用,

References

可以看到的app.config正确建立,并使用与我的测试代码片段中相同的通用代码。

Seen through Debugger

任何线索?

回答

3

你用错了!请停止做你正在做的事情(除非我完全误解你的要求......)!

当使用内置设置机制时,Visual Studio已经为您创建和维护app.config文件和Settings类。当您构建解决方案时,app.config文件将被重命名并复制到输出目录中作为applicationname.exe.config

您需要做的就是通过自动生成的属性访问您的设置。这适用于应用程序和用户设置。在你的例子中:

string s = Properties.Settings.Default.Hospkey; 

完成!而已!

如果你想改变用户的设置,做这样的事情:

Properties.Settings.Default.UserSettingName = value; 
Properties.Settings.Default.Save(); 

完成!而已!

请停止使用配置管理器或其他任何东西,也不要在输出中包含app.config文件。这一切都是默认的!

用户设置是值的用户应该能够通过应用程序的GUI(例如设置对话框)更改或将取决于应用程序的状态改变(如保留窗口位置,MRU文件等。 )并将保存在用户配置文件的某处(不管它在哪里 - 只要把它当作给定的)并且也可以自动从那里读取。

当您更新您的应用程序时,您最终可能会从您的构建中获得默认值。在这种情况下,请按照instructions here您不能通过更改安装文件夹中的.exe.config文件来覆盖用户设置,因为它们只会在第一次运行时从那里读取!

应用程序设置用于用户不应该能够更改的默认值。如有必要,您可以在.exe.config文件中手动更改这些文件。

+0

谢谢Thorsten!通过向我展示如何使用设置创建app.config文件,一位同事“帮助”了我。我把它放回到使用添加的应用程序配置文件,事情很好。我已经发现了“Properties.Settings.Default”语法,但它不允许我需要。这需要一个灵活的文件来创建相同的代码用于类似的报告,并永久设置失败的目的。 –

+0

我向上指出了你的答案,但没有声望让它出现。 –

+0

问题是,在这种情况下,你是否应该使用其他的东西来存储设置 - 可能是一些自定义的XML格式? –