2016-12-19 91 views
0

我目前在學區工作,我們正在嘗試爲我們的工具包創建一個C#exe文件。我們是C#的新手,正在學習它,但由於其靈活性而想使用它。 C#工具包將用於自動設置新的或重新映像的計算機,其中包含我們選擇的設置,程序,註冊表編輯器更改和首選項。配置文件INI? XML?其他?

我們有一個工作版本,我們在PowerShell中的硬編碼,我們轉移到C#。

我們目前的問題是我們如何使用設置/ config文件,如INI或XML從拉動一般信息和填充我們的函數和變量。這將是我們可以創建我們可以選擇並運行的一般配置文件。例如:

[Server] 
IP=172.1.0.10 
Port=9999 
PathToCSV=\\c:\Files.csv 
[Client] 
RestartComputerAfterScript=1 
Install.Browser.Firefox=1 
Install.Browser.Chrome=1 
Install.Java=0 
Install.PrinterLogic=1 
SysConfig.TempLoc=d:\TEMP 

這ini文件會從我們的C#GUI進行選擇並填充:

  1. 腳本使用值1運行後,計算機將重啓
  2. 火狐將使用值進行安裝1
  3. 爪哇將使用值0等
安裝

我們最終還會嘗試傳遞其他變量,如註冊表路徑和值等。

有沒有人有關於如何使用INI或有更好的建議來創建構建配置文件的建議?

資源我特地到: INI: https://www.codeproject.com/Articles/1966/An-INI-file-handling-class-using-C

+0

您是否在INI上設置了? XML或JSON等格式非常容易從磁盤反序列化。 –

+0

右鍵單擊您的項目,選擇添加 - >新建項目。選擇「應用程序配置文件」。把你想要的任何東西添加到你的新app.config文件中,然後用ConfigurationManager讀取它。 – itsme86

回答

3

如果您打開其他文件格式,我會使用JSON,因爲它的簡單性和易用性。

使用妙庫Newtonsoft.Json

莫代爾類:

class Server 
{ 
    public string IP { get; set; } 
    public int Port { get; set; } 
    public string PathToCSV { get; set; } 
} 

class Client 
{ 
    public bool RestartComputerAfterScript { get; set; } 
    public List<string> Install { get; set; } 
    public string TempLoc { get; set; } 
} 

class Config 
{ 
    public Server ServerConfig { get; set; } 
    public Client ClientConfig { get; set; } 
} 

配置。JSON:

{ 
    "ServerConfig": { 
     "IP": "172.1.0.10", 
     "Port": 9999, 
     "PathToCSV": "C:\\Files.csv" 
    }, 
    "ClientConfig": { 
     "RestartComputerAfterScript": true, 
     "Install": [ 
      "Firefox", 
      "Chrome", 
      "PrinterLogic" 
     ], 
     "TempLoc": "D:\\TEMP" 
    } 
} 

從磁盤中讀取文件:

public static Config Read(string path) 
{ 
    return JsonConvert.DeserializeObject<Config>(System.IO.File.ReadAllText(path)); 
} 

保存配置文件:

public static void Write(string path, Config config) 
{ 
    System.IO.File.WriteAllText(path, JsonConvert.SerializeObject(config, Formatting.Indented)); 
} 
+0

在我看來,缺點是沒有關於位置,文件名等的約定。但是它的優點是; JSON更易於閱讀,並且當ConfigurationManager由於格式化而無法打開web.config/app.config時,在#$%中很難找出錯誤。 –

3

.NET框架有一個ConfigurationManager class,作爲專爲這個目的..

摘錄:

XML

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <appSettings> 
    <add key="Setting1" value="May 5, 2014"/> 
    <add key="Setting2" value="May 6, 2014"/> 
    </appSettings> 
</configuration> 

代碼:

using System; 
using System.Configuration; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ReadAllSettings(); 
      ReadSetting("Setting1"); 
      ReadSetting("NotValid"); 
      AddUpdateAppSettings("NewSetting", "May 7, 2014"); 
      AddUpdateAppSettings("Setting1", "May 8, 2014"); 
      ReadAllSettings(); 
     } 

     static void ReadAllSettings() 
     { 
      try 
      { 
       var appSettings = ConfigurationManager.AppSettings; 

       if (appSettings.Count == 0) 
       { 
        Console.WriteLine("AppSettings is empty."); 
       } 
       else 
       { 
        foreach (var key in appSettings.AllKeys) 
        { 
         Console.WriteLine("Key: {0} Value: {1}", key, appSettings[key]); 
        } 
       } 
      } 
      catch (ConfigurationErrorsException) 
      { 
       Console.WriteLine("Error reading app settings"); 
      } 
     } 

     static void ReadSetting(string key) 
     { 
      try 
      { 
       var appSettings = ConfigurationManager.AppSettings; 
       string result = appSettings[key] ?? "Not Found"; 
       Console.WriteLine(result); 
      } 
      catch (ConfigurationErrorsException) 
      { 
       Console.WriteLine("Error reading app settings"); 
      } 
     } 

     static void AddUpdateAppSettings(string key, string value) 
     { 
      try 
      { 
       var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
       var settings = configFile.AppSettings.Settings; 
       if (settings[key] == null) 
       { 
        settings.Add(key, value); 
       } 
       else 
       { 
        settings[key].Value = value; 
       } 
       configFile.Save(ConfigurationSaveMode.Modified); 
       ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
      } 
      catch (ConfigurationErrorsException) 
      { 
       Console.WriteLine("Error writing app settings"); 
      } 
     } 
    } 
} 

而另一種選擇是使用Settings

0

我個人更喜歡有我在XML配置,或在一個Web應用程序的情況下,在JSON中由於一致性。
INI格式提供的一件事是它對非技術人員也是可讀的。

然而,如果你有興趣使用INI格式,那麼我可以建議你試試我的INI library。它可以簡化處理INI文件的任務。
此外,我建議你看一下解析和映射功能,簡而言之,它們將使您能夠將「0」值映射爲「false」和「1」值爲「true」,然後您可以檢索這些值來自INI鍵的布爾類型的值。請參閱以下示例:

IniFile ini = new IniFile(); 
ini.Load(@"C:\Files\Sample.ini"); 

ini.ValueMappings.Add("0", false); 
ini.ValueMappings.Add("1", true); 

IniSection section = ini.Sections["Client"]; 

bool installChrome; 
section.Keys["Install.Browser.Chrome"].TryParseValue(out installChrome); 

bool installJava; 
section.Keys["Install.Java"].TryParseValue(out installJava); 

Console.WriteLine(installChrome); 
Console.WriteLine(installJava); 
相關問題