public static ManifestFileItem GenerateFileItem(ManifestFileGridItem item) { var rtc = new ManifestFileItem(); rtc.FileName = item.FileName; rtc.CRC = GetFileHash(item.FullPatName); if (item.Folders == null)// || string.IsNullOrWhiteSpace(item.Folders)) { rtc.AddFolder(coreConst.Manifest.RootDirectoryFlag); } else { foreach (var folder in ItemFoldersManager.GetFolders(item.Folders)) { rtc.AddFolder(folder.Trim()); } } //if (item.AddInsFolder) rtc.AddFolder("Add-ins"); //if (item.ArcusFolder) rtc.AddFolder("Arcus2"); rtc.Type = item.Type; rtc.Version = item.Version; var manifestItem = item as IManifestFileItem; rtc.GAC = (RegInfo)manifestItem.GAC; rtc.REGSRV32 = (RegInfo)manifestItem.REGSRV32; rtc.REGASM = (RegInfo)manifestItem.REGASM; rtc.Delete = item.Delete; rtc.AddinName = item.AddinName; rtc.PublicKeyToken = item.PublicKeyToken; return(rtc); }
private static void Reg_GAC(ManifestFileGridItem item) { try { var result = Merlion.ECR.Update.Core.Environment.GAC.ReInstallAssembly(item.FileInfo.FullName); MessageBox.Show("Результат операции: " + result.ToString()); } catch (Exception ex) { LogAndShow("Возникло исключение при регистрации библиотеки через GAC", ex); } }
private static void UnReg_Asm(ManifestFileGridItem item) { try { var result = Merlion.ECR.Update.Core.Environment.AssemblyManager.UnInstall_ByRegAsm(item.FileInfo); MessageBox.Show("Результат операции: " + result.ToString()); } catch (Exception ex) { LogAndShow("Возникло исключение при разрегистрации библиотеки через RegAsm", ex); } }
private static void UnReg_GAC(ManifestFileGridItem item) { try { var result = Merlion.ECR.Update.Core.Environment.GAC.UnInstallAssembly(System.IO.Path.GetFileNameWithoutExtension(item.FileInfo.Name)); MessageBox.Show("Результат операции: " + result.ToString()); } catch (Exception ex) { LogAndShow("Возникло исключение при разрегистрации библиотеки через GAC", ex); } }
private static void ShowFileHash(ManifestFileGridItem item) { try { var crc = Merlion.ECR.Update.Core_2_0.Utilites.GetFileHash(item.FileInfo.FullName); var window = new CopyWindow("CRC", crc); window.ShowDialog(); } catch (Exception ex) { LogAndShow("Возникло исключение при выводе хеша файла", ex); } }
private static void OpenItemFile(ManifestFileGridItem item) { try { if (item.FileInfo != null && item.FileInfo.Exists) { item.FileInfo.OpenExplorer(); } } catch (Exception ex) { LogAndShow("Возникло исключение при открытии файла", ex); } }
private static void Reg_Svr32(ManifestFileGridItem item) { try { var result = Merlion.ECR.Update.Core.Environment.AssemblyManager.Install_ByRegSvr32(item.FileInfo); //var result = Merlion.ECR.Update.Core.Environment.AssemblyManager.ResultFromExitcode(exitcode); MessageBox.Show("Результат операции: " + result.ToString()); } catch (Exception ex) { LogAndShow("Возникло исключение при регистрации библиотеки через Regsvr32", ex); } }
private static void ShowPublicKeyToken(ManifestFileGridItem item) { try { var pkt = Merlion.ECR.Update.Core_2_0.Utilites.GetPublicKeyToken(item.FileInfo.FullName); var window = new CopyWindow("Токен публичного ключа", pkt); window.ShowDialog(); } catch (Exception ex) { LogAndShow("Возникло исключение при показе Токена первичного ключа", ex); } }
/// <summary> /// Асинхронное получение набора моделей ManifestFileGridItem из файлов Манифеста /// </summary> /// <param name="manifest">Манифест</param> /// <returns>Возвращает запущенную асинхронную задачу, возвращающую набор моделей для Grid'а</returns> public static Task <IEnumerable <ManifestFileGridItem> > GetGridFiles(this RTCManifest manifest) { return(Task.Run <IEnumerable <ManifestFileGridItem> >(() => { var result = new List <ManifestFileGridItem>(); if (manifest.FilesCount() == 0) { return result; } ManifestFileGridItem viewItem = null; var root = manifest.FileInfo == null ? "" : manifest.FileInfo.Directory.FullName; var directory = root; var folder = string.Empty; using (var domain = SeparatedAppDomain.Create()) { foreach (var file in manifest.Files) { folder = file.Folders.First(); if (folder.Equals(RTCManifest.RootDirectoryFlag)) { directory = root; } else { //формируем каталог как указан в манифесте directory = Path.Combine(root, folder); //если папки нет - пробуем загрузить файл из текущего расположения файла манифеста if (!Directory.Exists(directory)) { directory = root; } } var filePath = Path.Combine(directory, file.FileName); viewItem = new ManifestFileGridItem(file, filePath, domain); result.Add(viewItem); } } return result; })); }
private static void Reg_Asm(ManifestFileGridItem item) { try { bool codebase = MessageBox.Show("Использовать /codebase?", "Использование параметра", MessageBoxButton.YesNo) == MessageBoxResult.Yes; bool tlb = MessageBox.Show("Выгрузить tlb в каталог библиотеки?", "Использование параметра", MessageBoxButton.YesNo) == MessageBoxResult.Yes; var result = Merlion.ECR.Update.Core.Environment.AssemblyManager.Install_ByRegAsm(item.FileInfo, codebase, tlb); if (result == Merlion.ECR.Update.Core.Environment.RegistrationResult.Installed) { Merlion.ECR.Update.Core.Environment.RegAsm.InstallTypeLib(item.FileInfo); } MessageBox.Show("Результат операции: " + result.ToString()); } catch (Exception ex) { LogAndShow("Возникло исключение при регистрации библиотеки через RegAsm", ex); } }
private static void AddToDefaultTemplate(ManifestFileGridItem value) { try { var defTemplate = TemplatesSet.Load(); if (defTemplate.Contains(value)) { defTemplate.UpdateItemBy(value); } else { defTemplate.AddItem(value); } defTemplate.Save(); } catch (Exception ex) { LogAndShow("Возникло исключение при добавлении информации о файле в текущий шаблон", ex); } }
private static void ShowAddinName(ManifestFileGridItem item) { try { string name = string.Empty; using (var asm = SeparatedAssembly.Load(item.FileInfo)) { name = asm.GetControlAddinName(); if (asm.HasException) { throw new InvalidOperationException("Возникло исключение при получении имени Add-In'а", asm.LastEx); } } var window = new CopyWindow("Имя Add-In'a", name); window.ShowDialog(); } catch (Exception ex) { LogAndShow("Возникло исключение при показе Имени AddIn'a", ex); } }
private static void SignFile(ManifestFileGridItem value) { SigFile(value.FileInfo); }
internal static Task <ManifestChangeWindow> CheckManifest(RTCManifest manifest, bool active = false) { return(Task.Run(() => { var baseFiles = manifest.Files.OfType <IManifestFileItem>(); var manifestFileName = Path.GetFileNameWithoutExtension(manifest.FileInfo.Name); var manifestFiles = active ? GetActiveManifestFiles() //для активного манифеста собираем файлы по путям, указанным в манифесте : manifest.FileInfo.Directory.GetFiles(); //для прочих манифестов берём файлы из текущего каталога var rawFiles = StaticMethods.RemoveManifestFiles(manifestFiles); if (rawFiles.Count() == 0) { MessageBox.Show("В папке манифеста не найдено файлов для сравнения", "Файлы не найдены"); } List <ManifestFileGridItem> rawFileItems = null; RTCManifest tempManifest = null; //генерируем временный манифест из файлов, что лежат рядом с текущим var root = manifest.FileInfo.Directory; using (var domain = SeparatedAppDomain.Create()) rawFileItems = rawFiles.Select(fi => new ManifestFileGridItem(fi, root, domain)).ToList(); if (active) //при проверке активного манифеста { //выбираем файлы, для которых указано несколько папок var multipleFolderFiles = manifest.Files.Where(fi => fi.Folders.Length > 1); foreach (var fileItem in multipleFolderFiles) { //для каждого находим соответствующую пачку в активных файлах var activeFiles = rawFileItems.Where(rf => rf.FileName.Equals(fileItem.FileName)).ToList(); ManifestFileGridItem tempFile = null; /* * Для одинаковых файлов (по CRC) просто добавляем папку к первому попавшемуся * если в какой-то из папок файл отличается, то его просто пропускаем - на форме высветится красным */ foreach (var aFile in activeFiles) { if (aFile.CRC.Equals(fileItem.CRC)) { if (tempFile == null) { tempFile = aFile; } else { tempFile.AddFolder(aFile.Folders); rawFileItems.Remove(aFile); } } else { aFile.FileName = aFile.FileName + "_" + aFile.CRC; //добавляем CRC-шку для видимости } } tempFile = null; } } tempManifest = RTCManifest.Create(files: rawFileItems); ManifestFileItem baseItem = null; //копируем не значимые параметры из основного манифеста, чтобы не мозолили глаза при сравнении tempManifest.Version = manifest.Version; foreach (var mFile in tempManifest.Files) { baseItem = manifest.GetItemByFileName(mFile.FileName); if (baseItem == null) { continue; } if (baseItem.IsAssembly) { mFile.GAC = baseItem.GAC; mFile.REGASM = baseItem.REGASM; mFile.REGSRV32 = baseItem.REGSRV32; } mFile.Type = baseItem.Type; if (!active) //для активного манифеста важны папки { mFile.Folders = baseItem.Folders; } mFile.Delete = baseItem.Delete; } ManifestChangeWindow window = null; App.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, new Action(() => { var updateWindow = new ManifestChangeWindow(tempManifest, manifest); updateWindow.Title = active ? "Проверка рабочего манифеста" : "Обновление манифеста файлами из того же каталога"; updateWindow.ButtonText = "Обновить манифест"; updateWindow.UpdateEnable = !active; //запрещаем обновление для активного манифеста updateWindow.LeftLoadable = false; updateWindow.RightLoadable = false; window = updateWindow; })).Wait(); return window; })); }