/// <summary> /// Запущено ли дополнение /// </summary> /// <param name="info">Информация о дополнении</param> /// <returns>Запущено ли оно</returns> internal bool IsRunning(AddonInformation info) { lock (this.runningAddons) { return(this.runningAddons.Values.Any(i => i.Info.Guid == info.Guid)); } }
/// <summary> /// Удалить дополнение /// </summary> /// <param name="addonInformation"></param> internal void Uninstall(AddonInformation addonInformation) { lock (this.runningAddons) { var runningInfo = this.runningAddons.Values.FirstOrDefault(i => i.Info.Guid == addonInformation.Guid); if (runningInfo != null) { UnloadAddon(runningInfo, false); } } var folder = Path.GetDirectoryName(addonInformation.Path); Directory.Delete(folder, true); }
/// <summary> /// Получить информацию о дополнении на текущем языке приложения /// </summary> /// <param name="info">Запрашиваемое дополнение</param> /// <returns>Инорфмация о дополнении на текущем языке</returns> internal static AddonLocalizationInfoAttribute GetLocalizationInfoForAddon(AddonInformation info) { AddonLocalizationInfoAttribute neutral = null; var culture = CultureInfo.CurrentUICulture; foreach (var item in info.LocalizedInfos) { if (string.IsNullOrEmpty(item.Culture)) { neutral = item; } else if (culture.Name == item.Culture) { return(item); } } return(neutral); }
private void UpdateAddon(AddonInformation info, string updatePath) { var addonFolder = Path.GetDirectoryName(Path.GetDirectoryName(info.Path)); var updateLocalPath = Path.Combine(addonFolder, Path.GetFileName(updatePath)); Task.Factory.StartNew(() => { var webClient = new WebClient(); var progressDialog = new MyProgressDialog() { Text = Resources.FileDownloading }; progressDialog.FormClosed += (sender2, e2) => { if (webClient != null) { webClient.CancelAsync(); } }; webClient.Headers.Add(HttpRequestHeader.UserAgent, Program.UserAgentHeader); DownloadProgressChangedEventHandler downlDel = null; downlDel = (sender, e) => { progressDialog.Value = e.ProgressPercentage; }; webClient.DownloadProgressChanged += downlDel; webClient.DownloadFileCompleted += webClient_DownloadFileCompleted; webClient.DownloadFileAsync(new Uri(updatePath), updateLocalPath, new object[] { updateLocalPath, progressDialog, info }); Application.Run(progressDialog); }); }
/// <summary> /// Запустить дополнение /// </summary> /// <param name="info">Запускаемое дополнение</param> internal void RunAddon(AddonInformation info) { var thread = new Thread(arg => { AppDomain domain = null; Addon addon; try { domain = AppDomain.CreateDomain("Addon", AppDomain.CurrentDomain.Evidence, new AppDomainSetup { ApplicationBase = Application.StartupPath, PrivateBinPath = Path.GetDirectoryName(info.Path) }); var loader = (ObjectLoader)domain.CreateInstanceFromAndUnwrap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CIRCe.Base.dll"), "CIRCe.Base.ObjectLoader"); addon = (Addon)loader.LoadObject(info.Path, info.Info.AddonType); //domain.CreateInstanceFromAndUnwrap(info.Path, info.Info.AddonType); if (Settings.Default.SearchForAddons == CheckState.Checked) // Проверяем наличие обновления { if (addon.IsUpdateNeeded() && MessageBox.Show(string.Format("Дополнение \"{0}\" сообщает, что оно нуждается в обновлении. Обновить его?", GetLocalizationInfoForAddon(info).Title), Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { var updatePath = addon.GetUpdateUri(); addon.Dispose(); AppDomain.Unload(domain); UpdateAddon(info, updatePath); return; } } domain.UnhandledException += domain_UnhandledException; } catch (Exception e) { MessageBox.Show(string.Format("Ошибка запуска дополнения {0}: {1}", GetLocalizationInfoForAddon(info).Title, e.Message), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); if (domain != null) { AppDomain.Unload(domain); } return; } //SecurityPermission perm = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); //perm.Deny(); var addonInfo = new RunningAddonInfo { Domain = domain, MainThread = Thread.CurrentThread, Info = info, Instanse = addon }; lock (this.runningAddons) { this.runningAddons[addon] = addonInfo; } var showError = true; try { addon.Run(this.application); } catch (TargetInvocationException) { MessageBox.Show(string.Format(String.Format("{0} {1}", Resources.AddonError, "Нельзя подписываться на события Цирцеи в дополнении напрямую. Используйте метод Wrap или класс EventWrapper"), info.LocalizedInfos[0].Title), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); showError = false; } catch (Exception exc) { MessageBox.Show(string.Format(String.Format("{0} {1} {2}", Resources.AddonError, exc.Message, exc.GetType()), GetLocalizationInfoForAddon(info).Title), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); showError = false; } finally { UnloadAddon(addonInfo, showError: showError); } }) { IsBackground = true }; thread.SetApartmentState(ApartmentState.STA); thread.Start(); }
public AddonSettings(AddonInformation info) { this.info = info; }
public AddonSettings() { this.info = new AddonInformation(); }