web-dev-qa-db-ja.com

プログラムで設定ファイルをロードする方法

カスタム定義のConfigurationSection要素とConfig要素に対応するカスタム構成ファイルがあるとします。これらの構成クラスはライブラリに保存されます。

設定ファイルは次のようになります

<?xml version="1.0" encoding="utf-8" ?>
<Schoool Name="RT">
  <Student></Student>
</Schoool>

この構成ファイルをコードからプログラムでロードして使用するにはどうすればよいですか?

生のXML処理を使用したくありませんが、すでに定義されている構成クラスを活用します。

17
R.D

要件に合わせて調整する必要がありますが、これを行うためにプロジェクトの1つで使用するコードは次のとおりです。

var fileMap = new ConfigurationFileMap("pathtoconfigfile");
var configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
var sectionGroup = configuration.GetSectionGroup("applicationSettings"); // This is the section group name, change to your needs
var section = (ClientSettingsSection)sectionGroup.Sections.Get("MyTarget.Namespace.Properties.Settings"); // This is the section name, change to your needs
var setting = section.Settings.Get("SettingName"); // This is the setting name, change to your needs
return setting.Value.ValueXml.InnerText;

有効な.net構成ファイルを読んでいることに注意してください。このコードを使用して、DLLからEXEの構成ファイルを読み取ります。これがあなたの質問で与えたサンプル設定ファイルで機能するかどうかはわかりませんが、それは良いスタートになるはずです。

17
Marc

CodeProjectでの.NET2.0構成に関するJonRistaの3部構成のシリーズを確認してください。

強くお勧めし、よく書かれていて、非常に役に立ちます!

XMLフラグメントを実際にロードすることはできません-ロードできるものcanは、app.configのように見える完全な個別の構成ファイルです。

独自のカスタム構成セクションを作成および設計する場合は、CodePlexの 構成セクションデザイナー も確認する必要があります。これは、構成セクションを視覚的に設計し、すべてを備えたVisualStudioアドインです。必要な配管コードが生成されます。

8
marc_s

次のコードを使用すると、XMLからオブジェクトにコンテンツをロードできます。ソース、app.config、または別のファイルに応じて、適切なローダーを使用します。

using System.Collections.Generic;
using System.Xml.Serialization;
using System.Configuration;
using System.IO;
using System.Xml;

class Program
{
    static void Main(string[] args)
    {
        var section = SectionSchool.Load();
        var file = FileSchool.Load("School.xml");
    }
}

ファイルローダー:

public class FileSchool
{
    public static School Load(string path)
    {
        var encoding = System.Text.Encoding.UTF8;
        var serializer = new XmlSerializer(typeof(School));

        using (var stream = new StreamReader(path, encoding, false))
        {
            using (var reader = new XmlTextReader(stream))
            {
                return serializer.Deserialize(reader) as School;
            }
        }
    }
}

セクションローダー:

public class SectionSchool : ConfigurationSection
{
    public School Content { get; set; }

    protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
    {
        var serializer = new XmlSerializer(typeof(School)); // works in     4.0
        // var serializer = new XmlSerializer(type, null, null, null, null); // works in 4.5.1
        Content = (Schoool)serializer.Deserialize(reader);
    }
    public static School Load()
    {
        // refresh section to make sure that it will load
        ConfigurationManager.RefreshSection("School");
        // will work only first time if not refreshed
        var section = ConfigurationManager.GetSection("School") as SectionSchool;

        if (section == null)
            return null;

        return section.Content;
    }
}

データ定義:

[XmlRoot("School")]
public class School
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlElement("Student")]
    public List<Student> Students { get; set; }
}

[XmlRoot("Student")]
public class Student
{
    [XmlAttribute("Index")]
    public int Index { get; set; }
}

'app.config'の内容

<?xml version="1.0"?>
<configuration>

  <configSections>
    <section name="School" type="SectionSchool, ConsoleApplication1"/>
  </configSections>

  <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

  <School Name="RT">
    <Student Index="1"></Student>
    <Student />
    <Student />
    <Student />
    <Student Index="2"/>
    <Student />
    <Student />
    <Student Index="3"/>
    <Student Index="4"/>
  </School>

</configuration>

XMLファイルの内容:

<?xml version="1.0" encoding="utf-8" ?>
<School Name="RT">
  <Student Index="1"></Student>
  <Student />
  <Student />
  <Student />
  <Student Index="2"/>
  <Student />
  <Student />
  <Student Index="3"/>
  <Student Index="4"/>
</School>

投稿されたコードは、Visual Studio 2010(.Net 4.0)でチェックされています。セリリアザーの構造をから変更すると、.Net4.5.1で機能します。

new XmlSerializer(typeof(School))

new XmlSerializer(typeof(School), null, null, null, null);

提供されたサンプルがデバッガーの外部で開始された場合、最も単純なコンストラクターで動作しますが、VS2013 IDEデバッグで開始された場合、コンストラクターの変更が必要になります。そうでない場合、FileNotFoundExceptionが発生します(少なくともそれは私の場合)。

2
recineshto

configSource属性を使用すると、任意の構成要素を別のファイルに移動できます。メインのapp.configで、次のようにします。

<configuration>
  <configSections>
    <add name="schools" type="..." />
  </configSections>

  <schools configSource="schools.config />
</configuration>
2