【发布时间】:2013-01-22 17:12:15
【问题描述】:
我需要创建一个简单的自定义 ConfigurationSection,其中包含一个 IEnumerable。
我已经阅读了几篇文章和stackoverflow链接,以此为例: How to create custom config section in 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>
接下来我有整个结构来管理配置部分: 使用 System.Configuration;
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 使用了整个东西: 使用系统;
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);
}
}
}
}
}
这里的问题在于这两行:
//return (PathsConfigSection)System.Configuration
// .ConfigurationManager.GetSection("Disk") ?? new PathsConfigSection();
return (PathsConfigSection)System.Configuration
.ConfigurationManager.GetSection("Paths") ?? new PathsConfigSection();
如果我使用第二个(上面未注释),它将返回 null。
如果我使用注释的,那么它会抛出这样的异常:
System.Configuration.ConfigurationErrorsException 未处理
HResult=-2146232062 消息=创建 磁盘的配置节处理程序:无法加载类型 'ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection' 来自 程序集'System.Configuration,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'。 (C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config 第 4 行)Source=System.Configuration BareMessage=发生错误 为磁盘创建配置节处理程序:无法加载 输入“ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection” 从程序集'System.Configuration,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'.
文件名=C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config 行=4 堆栈跟踪: 在 System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(字符串 configKey, Boolean& isRootDeclaredHere) 在 System.Configuration.BaseConfigurationRecord.GetSectionRecursive(字符串 configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject、布尔型 requestIsHere、Object& 结果、Object& 结果运行时对象) 在 System.Configuration.BaseConfigurationRecord.GetSection(字符串 配置密钥) 在 System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(字符串 节名) 在 System.Configuration.ConfigurationManager.GetSection(字符串 sectionName) 在 ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection.GetConfig() 在 C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\Disk.cs:line 63 在 ConsoleApplication1_ConfigurationEnumerable.Program.Main(字符串 [] 参数)在 C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\Program.cs:line 9 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 保留SyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback 回调, 对象状态, Boolean 保留SyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart() InnerException: System.TypeLoadException H结果=-2146233054 消息=无法加载类型“ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection” 程序集'System.Configuration,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'。 源=系统配置 TypeName=ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection 堆栈跟踪: 在 System.Configuration.TypeUtil.GetTypeWithReflectionPermission(IInternalConfigHost 主机,字符串类型字符串,布尔 throwOnError) 在 System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.Init(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) 在 System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.InitWithRestrictedPermissions(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) 在 System.Configuration.RuntimeConfigurationRecord.CreateSectionFactory(FactoryRecord 工厂记录) 在 System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(字符串 configKey, Boolean& isRootDeclaredHere) 内部异常:
我的错在哪里?
【问题讨论】:
标签: c# configuration app-config