internal static LabelStorage LoadStorage(string file, List<Label> systemLabels, IEventLogging logging) { string xmlPath = file; string xsdPath = Path.ChangeExtension(file, "xsd"); XmlSerializer serializer = new XmlSerializer(typeof(LabelStorage)); XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas.Add("urn:labelstorage-schema", xsdPath); LabelStorage storage = null; //settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); using (XmlReader reader = XmlReader.Create(xmlPath, settings)) { storage = (LabelStorage)serializer.Deserialize(reader); } // теперя надо проверить, что нет пользовательских меток, совпадающих с системными. если есть - пользовательские надо удалять List<Label> toRemove = storage.FindAll( label => systemLabels.Any( syslab => syslab.Id == label.Id || syslab.Name.Equals(label.Name, StringComparison.InvariantCultureIgnoreCase))); foreach (Label item in toRemove) { logging.WriteWarning(string.Format("Пользовательская метка <{0}> удалена ввиду конфликта названия или идентификатора с одноименной системной меткой", item.Name)); } storage.RemoveAll(label=>toRemove.Any(tor => object.ReferenceEquals(tor, label))); // и оптяь сохраним storage.SaveStorage(file); return storage; }
public ModuleLoader(IEventLogging logging) { Debug.Assert(logging != null, "Нет системы логирования"); _logService = logging; string path = Path.GetFullPath(Settings.Default.ModuleFolder); if (!Directory.Exists(path)) _logService.WriteWarning(String.Format(LoadingWarning, path)); string[] fileList = Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories); IEnumerable<string> libraryList = getFilesByAttribyte(fileList); _moduleList = loadInstanceFromAssembly(libraryList, logging); }