// Restore the assemblies that were previously loaded public static void RestoreAssemblies() { AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(AssemblyLoadHandler); if (_assemblies.Count == 0) { return; } ProgressDialog progressDialog = new ProgressDialog(); progressDialog.Setup(StringParser.Parse("${res:ComponentInspector.ProgressDialog.LoadingPreviouslyOpenedAssembliesDialogTitle}"), StringParser.Parse("${res:ComponentInspector.ProgressDialog.LoadingPreviouslyOpenedAssembliesMessage}"), _assemblies.Count, ProgressDialog.HAS_PROGRESS_TEXT, ProgressDialog.FINAL); progressDialog.ShowIfNotDone(); TraceUtil.WriteLineInfo(null, DateTime.Now + " Assembly Restore start "); try { for (int i = _assemblies.Count - 1; i >= 0; --i) { PreviouslyOpenedAssembly assembly = _assemblies[i]; try { AssemblyName aName = new AssemblyName(); aName.CodeBase = assembly.CodeBase; TraceUtil.WriteLineInfo(null, DateTime.Now + " restore assy: " + assembly.CodeBase); progressDialog.UpdateProgressText(assembly.CodeBase); // Tell the TypeLibrary code the assembly // belongs to some type library Guid guid = Guid.Empty; // Don't mess with assemblies that came from // typelibs if the typelib is not there if (assembly.TypeLibGuid.Length > 0) { guid = new Guid(assembly.TypeLibGuid); TypeLibrary lib = TypeLibrary.GetTypeLibOpened(guid, assembly.TypeLibVersion); String assyFileName = new Uri(assembly.CodeBase).LocalPath; if (lib == null || !TypeLibrary.IsAssyCurrent(assyFileName, lib.FileName)) { TraceUtil.WriteLineInfo (null, DateTime.Now + " skipped assy (typelib not opened " + "or current): " + assembly.CodeBase); // Forget it _assemblies.Remove(assembly); progressDialog.UpdateProgress(1); continue; } } // The load event that happens under here causes the // assembly to appear in the tree Assembly assy = Assembly.Load(aName); // Tell the TypeLibrary code the assembly // belongs to some type library if (assembly.TypeLibGuid.Length > 0) { TypeLibrary.RestoreAssembly(assy, guid, assembly.TypeLibVersion); } TraceUtil.WriteLineInfo(null, DateTime.Now + " loaded assy: " + assembly.CodeBase); progressDialog.UpdateProgress(1); } catch (Exception ex) { TraceUtil.WriteLineWarning(null, "Assemblies - deleting bad assemblies entry: " + assembly.CodeBase + " " + ex); _assemblies.Remove(assembly); progressDialog.UpdateProgress(1); } } // This depends on having all of the assemblies restored TraceUtil.WriteLineInfo(null, DateTime.Now + " Assembly Restore end "); _assyRootNode.Expand(); } catch (Exception ex) { TraceUtil.WriteLineError(null, "Unexpected exception restoring assemblies: " + ex); } progressDialog.Finished(); }