public bool UpdateLibraries(ArrayList libraries, ArrayList projects, bool allowBackendRestart, bool forceUnload) { try { Registry.BeginChangeSet(); libraries.Add(Registry.CoreWidgetLibrary.Name); // Notify libraries that need to be unloaded and loaded again foreach (WidgetLibrary lib in Registry.RegisteredWidgetLibraries) { if (lib.NeedsReload) { appFrontend.NotifyLibraryUnloaded(lib.Name); } } if (!Registry.ReloadWidgetLibraries() && allowBackendRestart) { return(false); } // Store a list of registered libraries, used later to know which // ones need to be unloaded ArrayList loaded = new ArrayList(); foreach (WidgetLibrary alib in Registry.RegisteredWidgetLibraries) { loaded.Add(alib.Name); } // Load required libraries Hashtable visited = new Hashtable(); LoadLibraries(new AssemblyResolver(this), visited, libraries); foreach (ProjectBackend project in projects) { LoadLibraries(project.Resolver, visited, project.WidgetLibraries); } // Unload libraries which are not required foreach (string name in loaded) { if (!visited.Contains(name)) { if (forceUnload && allowBackendRestart) { return(false); } appFrontend.NotifyLibraryUnloaded(name); Registry.UnregisterWidgetLibrary(Registry.GetWidgetLibrary(name)); } } return(true); } finally { Registry.EndChangeSet(); } }