public static SeparatedAssembly LoadSeparatedAssembly(this SeparatedAppDomain domain, FileInfo fInfo) { SeparatedAssembly sepAsm = null; if (domain == null) { sepAsm = SeparatedAssembly.Load(fInfo); } else { sepAsm = domain.Load(fInfo); } return(sepAsm); }
/// <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; })); }
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; })); }