public AspectWindowPane(IDEInterop ide) { try { this.ide = ide; KeyboardShortcutHelper.control = this; //Hardcoded language Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru"); InitializeComponent(); Adapter = new AspectCore.TreeViewAdapter(Manager, tvAspects); fmSelectPoint = new FmSelectPoint(ide, treeManager); SynchronizeUndoButtons(); if (treeManager.GetParsersCount() == 0) { GlobalData.traceAction(Strings.NoParsers); } GlobalData.traceAction("Загрузка плагина завершена"); GlobalData.traceAction("Версия .net: " + System.Environment.Version); GlobalData.traceAction(System.Environment.Is64BitProcess ? "64-разрядный процесс" : "32-разрядный процесс"); //костыль tvAspects.Scrollable = true; } catch (Exception exc) { ExceptionInfoHelper.ShowInfo(exc); } }
public void LoadParsersFromGAC() { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); string gacPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\Microsoft.NET\\assembly"; DirectoryInfo di = new DirectoryInfo(gacPath); FileInfo [] files = di.GetFiles(GlobalData.ParserAssemblyMask, SearchOption.AllDirectories); sw.Stop(); GlobalData.traceAction("Поиск сборок с парсерами: " + sw.ElapsedMilliseconds + " мс"); sw.Reset(); sw.Start(); foreach (FileInfo fi in files) { LoadParserFromFile(fi.FullName); } GlobalData.traceAction("Загрузка парсеров: " + sw.ElapsedMilliseconds + " мс"); }
/// <summary> /// Парсинг текста. /// Этой функцией можно вызывать парсинг открытого существующего файла, если он изменен и еще не сохранен, получив его обновленное содержимое из среды разработки. /// </summary> /// <param name="Text">Текст</param> /// <param name="FileName">Имя файла. Должно содержать как минимум расширение для корректного выбора парсера. /// Имя файла будет сохранено в узлах аспектного дерева</param> /// <returns>Корень дерева</returns> public PointOfInterest ParseText(string Text, string FileName) { string LangID = FilenameToLangID(FileName); ILightWeightScanner Scanner; LightweightParserBase Parser; if (scanners.ContainsKey(LangID) && parsers.ContainsKey(LangID)) { Scanner = scanners[LangID]; Parser = parsers[LangID]; } else if (DefaultParser != null && DefaultScanner != null) { Scanner = DefaultScanner; Parser = DefaultParser; } else { GlobalData.traceAction("Нет парсера для файлов " + LangID); return(null); } Scanner.SetSource(Text); Parser.Parse(); SourceEntity result = Parser.Root; if (result == null) { return(null); } PointOfInterest rootPt = ConvertSourceEntityToPointOfInterest(result, FileName); SetContext(rootPt); _LastTimeErrors.Clear(); foreach (SourceEntity se in Parser.Errors) { _LastTimeErrors.Add(ConvertSourceEntityToPointOfInterest(se, FileName)); } return(rootPt); }
/// <summary> /// Загрузка парсеров из указанной директории /// </summary> /// <param name="path">Путь к директории, содержащей сборки с парсерами</param> public void LoadParsers(string path) { try { DirectoryInfo di = new DirectoryInfo(path); if (!di.Exists) { GlobalData.traceAction("Сбой при загрузке парсеров. Папка не существует: " + di.FullName); } System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); FileInfo[] dllFiles = di.GetFiles("*.dll"); foreach (FileInfo fi in dllFiles) { LoadParserFromFile(fi.FullName); } sw.Stop(); GlobalData.traceAction("Загрузка парсеров: " + sw.ElapsedMilliseconds + " мс"); } catch (Exception e) { GlobalData.traceAction("ИСКЛЮЧЕНИЕ: " + e); } }
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); }