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);
        }