entlib无效的TraceListenerData类型

我为Enterprise Library 5 Logging Block创建了一个自定义侦听器,它由配置编辑器识别,但会抛出运行时配置exception:

尝试使用自定义记录器

static IUnityContainer _container; static LogWriter _writer; static IServiceLocator _locator; public static void Inf(string message) { if (_container == null) { // Create the container _container = new UnityContainer(); // Configurator will read Enterprise Library configuration // and set up the container var configurator = new UnityContainerConfigurator(_container); // Configuration source holds the new configuration we want to use // load this in your own code IConfigurationSource configSource = new SystemConfigurationSource(true); // Configure the container EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource); // Wrap in ServiceLocator _locator = new UnityServiceLocator(_container); } if (_writer == null) { _writer = _locator.GetInstance(); } if (_writer != null && _container != null) { LogEntry log = new LogEntry(); log.Message = message; log.Categories.Add("Information"); log.Severity = TraceEventType.Information; _writer.Write(log); } } 

在DLL中拥有TraceListener

 using System.Diagnostics; using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; using Microsoft.Practices.EnterpriseLibrary.Logging; using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters; namespace CustomLogger { [ConfigurationElementType(typeof(LoggerCustomData))] public class LoggerCustom : TraceListener //CustomTraceListener { readonly ILogFormatter _formatter; public LoggerCustom() : this(string.Empty, null) { } public LoggerCustom(string name) : this(name, null) { } public LoggerCustom(string name, ILogFormatter formatter) : base(name) { this._formatter = formatter; } public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data) { if ((Filter == null) || Filter.ShouldTrace(eventCache, source, eventType, id, null, null, data, null)) { if (data is LogEntry) { if (_formatter != null) { WriteLine(_formatter.Format(data as LogEntry)); } else { base.TraceData(eventCache, source, eventType, id, data); } } else { base.TraceData(eventCache, source, eventType, id, data); } } } public override void Write(string message) { Trace.Write(message); } public override void WriteLine(string message) { Trace.WriteLine(message); } } } 

在dll中自定义TraceListenerData

 using System; using System.Configuration; using System.Diagnostics; using System.Linq.Expressions; using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ContainerModel; using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Design; using Microsoft.Practices.EnterpriseLibrary.Common.Properties; using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration; using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters; namespace CustomLogger { [ResourceDisplayName(typeof(Resources), "CustomLoggerDataDisplayName")] [ResourceDescription(typeof(Resources), "CustomLoggerDataDescription")] public class LoggerCustomData : TraceListenerData { private const string FormatterNameProperty = "formatter"; public LoggerCustomData() : this("unnamed", null, TraceOptions.None) { } public LoggerCustomData(string name) : this(name, null, TraceOptions.None) { } public LoggerCustomData(string name, string formatterName) : this(name, formatterName, TraceOptions.None) { } protected LoggerCustomData(string name, string formatterName, TraceOptions traceOutputOptions) : base(name, typeof(LoggerCustom), traceOutputOptions, SourceLevels.All) { ListenerDataType = typeof(LoggerCustomData); Formatter = formatterName; } [ConfigurationProperty(FormatterNameProperty, IsRequired = false), Reference(typeof(NameTypeConfigurationElementCollection), typeof(FormatterData)), ResourceDisplayName(typeof(Resources), "CustomLoggerDataFormatterDisplayName"), ResourceDescription(typeof(Resources), "CustomLoggerDataFormatterDescription")] public string Formatter { get { return (string)base[FormatterNameProperty]; } set { base[FormatterNameProperty] = value; } } protected override Expression<Func> GetCreationExpression() { return () => new LoggerCustom(Name, Container.ResolvedIfNotNull(Formatter)); } } } 

由ConfEditor生成的app.config添加

   

.ConfigureContainer的exception(configurator,configSource)

配置’listenerDataType =“CustomLogger.LoggerCustomData,CustomLogger,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”’中的TraceListenerData类型无效。

为什么不起作用? 🙁 🙁

ps这篇文章是entlib CustomTraceListener未解析的演变