bool ScanAssembly(IProgressStatus monitor, string filePath, AddinScanResult scanResult, out AddinDescription config)
        {
            config = null;

            try {
                Assembly asm = Util.LoadAssemblyForReflection(filePath);

                // Get the config file from the resources, if there is one

                string configFile = null;
                foreach (string res in asm.GetManifestResourceNames())
                {
                    if (res.EndsWith(".addin") || res.EndsWith(".addin.xml"))
                    {
                        configFile = res;
                        break;
                    }
                }

                if (configFile != null)
                {
                    using (Stream s = asm.GetManifestResourceStream(configFile)) {
                        string asmFile = new Uri(asm.CodeBase).LocalPath;
                        config = AddinDescription.Read(s, Path.GetDirectoryName(asmFile));
                    }
                }
                else
                {
                    // On this case, only scan the assembly if it has the Addin attribute.
                    AddinAttribute att = (AddinAttribute)Attribute.GetCustomAttribute(asm, typeof(AddinAttribute), false);
                    if (att == null)
                    {
                        config = null;
                        return(true);
                    }
                    config = new AddinDescription();
                }

                config.BasePath  = Path.GetDirectoryName(filePath);
                config.AddinFile = filePath;

                string rasmFile = Path.GetFileName(filePath);
                if (!config.MainModule.Assemblies.Contains(rasmFile))
                {
                    config.MainModule.Assemblies.Add(rasmFile);
                }

                return(ScanDescription(monitor, config, asm, scanResult));
            }
            catch (Exception ex) {
                // Something went wrong while scanning the assembly. We'll ignore it for now.
                monitor.ReportError("There was an error while scanning assembly: " + filePath, ex);
                return(false);
            }
        }
        bool ScanDescription(IProgressStatus monitor, AddinDescription config, Assembly rootAssembly, AddinScanResult scanResult)
        {
            // First of all scan the main module

            ArrayList assemblies           = new ArrayList();
            ArrayList hostExtensionClasses = new ArrayList();

            try {
                foreach (string s in config.MainModule.Assemblies)
                {
                    string   asmFile = Path.Combine(config.BasePath, s);
                    Assembly asm     = Util.LoadAssemblyForReflection(asmFile);
                    assemblies.Add(asm);
                }

                foreach (Assembly 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 (Assembly asm in assemblies)
                {
                    ScanAssemblyContents(config, asm, hostExtensionClasses, scanResult);
                }

                if (config.IsRoot && scanResult.HostIndex != null)
                {
                    // If the add-in is a root, register its assemblies
                    foreach (Assembly asm in assemblies)
                    {
                        string asmFile = new Uri(asm.CodeBase).LocalPath;
                        scanResult.HostIndex.RegisterAssembly(asmFile, config.AddinId, config.AddinFile);
                    }
                }
            } catch (Exception ex) {
                if (monitor.VerboseLog)
                {
                    monitor.Log("Could not load some add-in assemblies: " + ex.Message);
                }
                scanResult.AddFileToWithFailure(config.AddinFile);
                return(false);
            }

            foreach (Type t in hostExtensionClasses)
            {
                RegisterHostTypeNode(config, t, assemblies);
            }

            // Extension node types may have child nodes declared as attributes. Find them.

            Hashtable internalNodeSets = new Hashtable();

            foreach (ExtensionNodeSet eset in config.ExtensionNodeSets)
            {
                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();
                        foreach (string s in mod.Assemblies)
                        {
                            string   asmFile = Path.Combine(config.BasePath, s);
                            Assembly asm     = Util.LoadAssemblyForReflection(asmFile);
                            assemblies.Add(asm);
                        }
                        foreach (Assembly asm in assemblies)
                        {
                            ScanAssemblyContents(config, asm, null, scanResult);
                        }

                        if (config.IsRoot && scanResult.HostIndex != null)
                        {
                            // If the add-in is a root, register its assemblies
                            foreach (Assembly asm in assemblies)
                            {
                                string asmFile = new Uri(asm.CodeBase).LocalPath;
                                scanResult.HostIndex.RegisterAssembly(asmFile, config.AddinId, config.AddinFile);
                            }
                        }
                    } catch (Exception ex) {
                        if (monitor.VerboseLog)
                        {
                            monitor.Log("Could not load some add-in assemblies: " + ex.Message);
                        }
                        scanResult.AddFileToWithFailure(config.AddinFile);
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 3
0
 public object LoadAssembly(string file)
 {
     return(Util.LoadAssemblyForReflection(file));
 }
Ejemplo n.º 4
0
        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.AddFileToIgnore(Util.GetFullPath(file));
                }

                foreach (string s in config.MainModule.Assemblies)
                {
                    string asmFile = Path.Combine(config.BasePath, s);
                    asmFiles.Add(asmFile);
                    Assembly asm = Util.LoadAssemblyForReflection(asmFile);
                    assemblies.Add(asm);
                    scanResult.AddFileToIgnore(Util.GetFullPath(asmFile));
                }

                foreach (Assembly 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 (Assembly asm in assemblies)
                {
                    ScanAssemblyContents(config, asm, hostExtensionClasses, scanResult);
                }
            } catch (Exception ex) {
                ReportReflectionException(monitor, ex, config, scanResult);
                return(false);
            }

            foreach (Type 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);
                            Assembly asm = Util.LoadAssemblyForReflection(asmFile);
                            assemblies.Add(asm);
                            scanResult.AddFileToIgnore(Util.GetFullPath(asmFile));
                        }
                        foreach (Assembly asm in assemblies)
                        {
                            ScanAssemblyContents(config, asm, null, scanResult);
                        }
                    } catch (Exception ex) {
                        ReportReflectionException(monitor, ex, config, scanResult);
                    }
                }
            }

            config.StoreFileInfo();
            return(true);
        }