static SetExchangeSettings()
 {
     SetExchangeSettings.AddRegisteredSchema(new MRSConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new ConfigurationADImpl.ADCacheConfigurationSchema());
     SetExchangeSettings.AddRegisteredSchema(new TenantRelocationConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new LoadBalanceADSettings());
     SetExchangeSettings.AddRegisteredSchema(new TenantDataCollectorConfig());
     SetExchangeSettings.AddRegisteredSchema(new UpgradeBatchCreatorConfig());
     SetExchangeSettings.AddRegisteredSchema(new UpgradeHandlerConfig());
     SetExchangeSettings.AddRegisteredSchema(new SlimTenantConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new TenantUpgradeConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new AdDriverConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new MRSRecurrentOperationConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new DirectoryTasksConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new ProvisioningTasksConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new PluggableDivergenceHandlerConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new MigrationServiceConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new ComplianceConfigSchema());
     SetExchangeSettings.AddRegisteredSchema(new OlcConfigSchema());
     SetExchangeSettings.SchemaAssemblyMap.Add("Store", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.Server.Storage.Common.dll", "Microsoft.Exchange.Server.Storage.Common.StoreConfigSchema"));
     SetExchangeSettings.SchemaAssemblyMap.Add("MigrationMonitor", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.MigrationMonitor.dll", "Microsoft.Exchange.Servicelets.MigrationMonitor.MigrationMonitor+MigrationMonitorConfig"));
     SetExchangeSettings.SchemaAssemblyMap.Add("UpgradeInjector", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.UpgradeInjector.dll", "Microsoft.Exchange.Servicelets.Upgrade.UpgradeInjector+UpgradeInjectorConfig"));
     SetExchangeSettings.SchemaAssemblyMap.Add("AuthAdmin", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.AuthAdminServicelet.dll", "Microsoft.Exchange.Servicelets.AuthAdmin.AuthAdminContext+AuthAdminConfig"));
     SetExchangeSettings.SchemaAssemblyMap.Add("ServiceHost", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.ServiceHost.exe", "Microsoft.Exchange.ServiceHost.ServiceHostConfigSchema"));
     SetExchangeSettings.SchemaAssemblyMap.Add("SlowMRSDetector", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.MRS.SlowMRSDetector.dll", "Microsoft.Exchange.Servicelets.MRS.SlowMRSDetectorContext+SlowMRSDetectorConfig"));
     SetExchangeSettings.SchemaAssemblyMap.Add("DrumTesting", new SetExchangeSettings.SchemaAssembly("Microsoft.Exchange.DrumTesting.exe", "Microsoft.Exchange.DrumTesting.DrumConfigSchema"));
     SetExchangeSettings.SchemaAssemblyMap.Add("BatchCreator", new SetExchangeSettings.SchemaAssembly("MSExchangeMigrationWorkflow.exe", "Microsoft.Exchange.Servicelets.BatchCreator.BatchCreatorConfig"));
 }
        internal static ConfigSchemaBase GetRegisteredSchema(string identity, bool force, Task.TaskVerboseLoggingDelegate writeVerbose, Task.TaskErrorLoggingDelegate writeError)
        {
            ConfigSchemaBase configSchemaBase = null;

            if (force || SetExchangeSettings.RegisteredSchemas.TryGetValue(identity, out configSchemaBase))
            {
                return(configSchemaBase);
            }
            SetExchangeSettings.SchemaAssembly schemaAssembly;
            if (!SetExchangeSettings.SchemaAssemblyMap.TryGetValue(identity, out schemaAssembly))
            {
                writeError(new ExchangeSettingsInvalidSchemaException(identity), ErrorCategory.InvalidOperation, null);
            }
            string text = Path.Combine(ConfigurationContext.Setup.InstallPath, "bin", schemaAssembly.ModuleName);

            writeVerbose(new LocalizedString(string.Format("Attempting to load schema for {0} from {1}", identity, text)));
            try
            {
                Assembly assembly = Assembly.LoadFrom(text);
                configSchemaBase = (ConfigSchemaBase)assembly.CreateInstance(schemaAssembly.TypeName, true, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, null, null, null);
                if (configSchemaBase == null)
                {
                    writeVerbose(new LocalizedString(string.Format("Assembly {0} found but type {1} could not get loaded", text, schemaAssembly.TypeName)));
                    writeError(new ExchangeSettingsInvalidSchemaException(identity), ErrorCategory.InvalidOperation, null);
                }
                if (string.Compare(configSchemaBase.Name, identity, StringComparison.InvariantCulture) != 0)
                {
                    writeVerbose(new LocalizedString(string.Format("identity used {0} does not match identity found on schema {1}", identity, configSchemaBase.Name)));
                    writeError(new ExchangeSettingsInvalidSchemaException(identity), ErrorCategory.InvalidOperation, null);
                }
                SetExchangeSettings.AddRegisteredSchema(configSchemaBase);
                return(configSchemaBase);
            }
            catch (FileNotFoundException)
            {
                writeError(new ExchangeSettingsAssemblyNotFoundException(identity, text, schemaAssembly.TypeName), ErrorCategory.InvalidOperation, null);
            }
            return(null);
        }