内部に 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'。ソース=システム。
私のせいはどこですか?