// Initialize the world. // // This logically belongs in the static constructor (as it only needs // to be done once), except for one thing: if the .config file has a // syntax error, .NET throws a ConfigurationException. If we read the // .config file in the static ctor, we throw a ConfigurationException // from the static ctor, which results in a TypeLoadException. Oops. // Reading the .config file here will allow the static ctor to // complete successfully, allowing us to throw a normal // ConfigurationException should the .config file contain an error. // // There are also some ordering issues. // // DiagnosticsConfigurationHandler doesn't store values within TraceImpl, // but instead stores values it reads from the .config file within a // TraceImplSettings object (accessible via the TraceImplSettings.Key key // in the IDictionary returned). private static void InitOnce () { if (initLock != null) { lock (initLock) { if (listeners == null) { #if CONFIGURATION_DEP IDictionary d = DiagnosticsConfiguration.Settings; #else IDictionary d = new Dictionary<string, object> { { TraceImplSettings.Key, new TraceImplSettings () } }; #endif TraceImplSettings s = (TraceImplSettings)d[TraceImplSettings.Key]; d.Remove (TraceImplSettings.Key); autoFlush = s.AutoFlush; // indentLevel = s.IndentLevel; indentSize = s.IndentSize; listeners = s.Listeners; } } initLock = null; } }
public void AddRange (TraceListenerCollection value) { InitializeRange (value); listeners.AddRange (value.listeners); }