public bool LoadParserFromFile(string path, bool ReplaceExisting = false) { try { GlobalData.traceAction("Чтение файла " + path); byte[] AsmBytes = File.ReadAllBytes(path); //Assembly asm = Assembly.LoadFrom(path); Assembly asm = Assembly.Load(File.ReadAllBytes(path)); ILightWeightScanner scanner = null; LightweightParserBase parser = null; // найти и создать сканер foreach (Type T in asm.GetTypes()) { try { if (T.IsClass && T.IsPublic && T.FullName.IndexOf(ScannerClassName) >= 0) { scanner = (ILightWeightScanner)Activator.CreateInstance(T); break; } } catch (Exception) { } } if (scanner == null) { GlobalData.traceAction("Сборка не содержит парсера"); return(false); } // найти и создать парсер foreach (Type T in asm.GetTypes()) { try { if (T.IsClass && T.IsPublic && T.FullName.IndexOf(ParserClassName) >= 0) { object[] parametersArray = new object[] { scanner.Scanner }; parser = (LightweightParserBase)Activator.CreateInstance(T, parametersArray); break; } } catch (Exception) { } } // добавить парсер и сканер в словари if (parser != null) { foreach (string id in parser.LanguageID) { if (id == "*") { if (DefaultParser == null || ReplaceExisting) { DefaultScanner = scanner; DefaultParser = parser; GlobalData.traceAction("Загружен парсер по-умолчанию"); return(true); } else { GlobalData.traceAction("Парсер по-умолчанию был загружен ранее, пропускаем"); } } else if (!parsers.ContainsKey(id)) { scanners.Add(id, scanner); parsers.Add(id, parser); GlobalData.traceAction("Загружен парсер для файлов " + id); } else if (ReplaceExisting) { scanners[id] = scanner; parsers[id] = parser; GlobalData.traceAction("Перезагружен парсер для файлов " + id); } else { GlobalData.traceAction("Парсер для файлов " + id + " был загружен ранее, пропускаем"); } } } else { GlobalData.traceAction("Сборка не содержит парсера"); } } catch (Exception e) { GlobalData.traceAction("ИСКЛЮЧЕНИЕ: " + e); } return(false); }