0

内部に IEnumerable を含む単純なカスタマイズされた ConfigurationSection を作成する必要があります。

これを簡単な例として取り上げて、いくつかの記事とstackoverflowリンクを読みました: app.configでカスタム構成セクションを作成する方法?

したがって、コンソール アプリ内に次の構成ファイル セクションがあります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="Disk"
             type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection"/>
  </configSections>
  <Disk>
    <Paths>
      <Path name="one" permission="1" />
      <Path name="two" permission="2" />
      <Path name="three" permission="3" />
    </Paths>
  </Disk>
</configuration>

次に、config セクションを管理するための構造全体を用意しました。

namespace ConsoleApplication1_ConfigurationEnumerable
{
    public class Path: ConfigurationElement
    {
        [ConfigurationProperty("name", IsRequired = true)]
        public string Name
        {
            get
            {
                return (string)this["name"];
            }
        }

        [ConfigurationProperty("permission", IsRequired=true)]
        public string Permission
        {
            get
            {
                return (string)this["permission"];
            }
        }
    }    

    public class Paths: ConfigurationElementCollection 
    {
        public Path this[int index] 
        {
            get
            {
                return base.BaseGet(index) as Path;
            }
            set 
            {
                if (base.BaseGet(index) != null) {
                    base.BaseRemoveAt(index);
                }
                this.BaseAdd(index, value);
            }
        }

        protected override ConfigurationElement CreateNewElement() 
        {
            return new Path();
        }
        protected override object  GetElementKey(ConfigurationElement element)
        {
            return ((Path)element).Name;
        }
    }

    public class PathsConfigSection : ConfigurationSection
    {
        public static PathsConfigSection GetConfig()
        {
            //return (PathsConfigSection)System.Configuration.ConfigurationManager.GetSection("Disk") ?? new PathsConfigSection();
            return (PathsConfigSection)System.Configuration.ConfigurationManager.GetSection("Paths") ?? new PathsConfigSection();
        }

        [ConfigurationProperty("Paths")]
        public Paths Paths
        {
            get 
            {
                object o = this["Paths"];
                return o as Paths;
            }
        }
    }
}

そして、ここですべてを使用する program.cs: using System;

namespace ConsoleApplication1_ConfigurationEnumerable
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = PathsConfigSection.GetConfig();
            if (config == null || config.Paths.Count == 0)
            {
                Console.WriteLine("Is null or empty");
            }
            else
            {
                foreach (Path item in config.Paths)
                {
                    Console.WriteLine("Item {0} with valuer {1}", item.Name, item.Permission);
                }
            }
        }
    }
}

ここでの問題は、次の 2 行の内部にあります。

//return (PathsConfigSection)System.Configuration
//       .ConfigurationManager.GetSection("Disk") ?? new PathsConfigSection();
return (PathsConfigSection)System.Configuration
       .ConfigurationManager.GetSection("Paths") ?? new PathsConfigSection();

2番目のもの(上記のコメントなし)を使用すると、nullが返されます。

コメント付きのものを使用すると、次のような例外がスローされます。

System.Configuration.ConfigurationErrorsException が処理されませんでした
HResult=-2146232062 Message=ディスクの構成セクション ハンドラーの作成中にエラーが発生しました: アセンブリ 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' から型 'ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection' を読み込めませんでした。(C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config 行 4) ソース=System.Configuration BareMessage=ディスクの構成セクション ハンドラの作成中にエラーが発生しました: タイプを読み込めませんでしたアセンブリ 'System.Configuration、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b03f5f7f11d50a3a' からの 'ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection'。
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態、Boolean preserveSyncCtx) での ThreadStart_Context(オブジェクト状態) System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態、Boolean preserveSyncCtx) で System. Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: System.TypeLoadException HResult=-2146233054 メッセージ = タイプ 'ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection' をアセンブリ 'System.構成、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b03f5f7f11d50a3a'。ソース=システム。

私のせいはどこですか?

4

2 に答える 2

4

タグでクラスを指定するときは、完全修飾アセンブリ名を使用する必要があります。configSections

<configSections>
  <section name="Disk"
           type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection, ConsoleApplication1"/>
</configSections>

これは、アセンブリの名前がConsoleApplication1. それでも例外が発生する場合は、次のコードを使用して正しい値を判断できます。

typeof(ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection).FullName
                                                                      .ToString()

ところで:あなたの名前空間は奇妙です。.命名基準では、名前空間階層を分離するときにドット ( ) を使用することをお勧めします。

namespace ConsoleApplication1.ConfigurationEnumerable
于 2013-02-07T08:57:59.380 に答える
0

最初の行 (コメントアウトされた行) を使用する必要があると思います。問題は、<section>構成ファイルの要素にあります。ダニエルの答えに従って、それがどのように見えるかを確認してください。

于 2013-02-07T09:00:20.057 に答える