bool ScanDescription(IProgressStatus monitor, AddinDescription config, Assembly rootAssembly, AddinScanResult scanResult) { // First of all scan the main module ArrayList assemblies = new ArrayList(); ArrayList asmFiles = new ArrayList(); ArrayList hostExtensionClasses = new ArrayList(); try { // Add all data files to the ignore file list. It avoids scanning assemblies // which are included as 'data' in an add-in. foreach (string df in config.AllFiles) { string file = Path.Combine(config.BasePath, df); scanResult.AddPathToIgnore(Util.GetFullPath(file)); } foreach (string df in config.AllIgnorePaths) { string path = Path.Combine(config.BasePath, df); scanResult.AddPathToIgnore(Util.GetFullPath(path)); } foreach (string s in config.MainModule.Assemblies) { string asmFile = Path.Combine(config.BasePath, s); asmFiles.Add(asmFile); object asm = reflector.LoadAssembly(asmFile); assemblies.Add(asm); scanResult.AddPathToIgnore(Util.GetFullPath(asmFile)); } foreach (object asm in assemblies) { ScanAssemblyAddinHeaders(config, asm, scanResult); } // The add-in id and version must be already assigned at this point // Clean host data from the index. New data will be added. if (scanResult.HostIndex != null) { scanResult.HostIndex.RemoveHostData(config.AddinId, config.AddinFile); } foreach (object asm in assemblies) { ScanAssemblyContents(config, asm, hostExtensionClasses, scanResult); } } catch (Exception ex) { ReportReflectionException(monitor, ex, config, scanResult); return(false); } foreach (object t in hostExtensionClasses) { RegisterHostTypeNode(config, t, assemblies); } // Extension node types may have child nodes declared as attributes. Find them. Hashtable internalNodeSets = new Hashtable(); ArrayList setsCopy = new ArrayList(); setsCopy.AddRange(config.ExtensionNodeSets); foreach (ExtensionNodeSet eset in setsCopy) { ScanNodeSet(config, eset, assemblies, internalNodeSets); } foreach (ExtensionPoint ep in config.ExtensionPoints) { ScanNodeSet(config, ep.NodeSet, assemblies, internalNodeSets); } // Now scan all modules if (!config.IsRoot) { foreach (ModuleDescription mod in config.OptionalModules) { try { assemblies.Clear(); asmFiles.Clear(); foreach (string s in mod.Assemblies) { string asmFile = Path.Combine(config.BasePath, s); asmFiles.Add(asmFile); object asm = reflector.LoadAssembly(asmFile); assemblies.Add(asm); scanResult.AddPathToIgnore(Util.GetFullPath(asmFile)); } foreach (object asm in assemblies) { ScanAssemblyContents(config, asm, null, scanResult); } } catch (Exception ex) { ReportReflectionException(monitor, ex, config, scanResult); } } } config.StoreFileInfo(); return(true); }