Esempio n. 1
0
        // 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();
        }