Exemplo n.º 1
0
        public List <iS3MenuItem> LoadExtension()
        {
            var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            //Assembly exeAssembly = Assembly.GetExecutingAssembly();
            string exeLocation    = System.IO.Directory.GetCurrentDirectory();
            string extensionsPath = exeLocation + "\\extensions";

            if (!Directory.Exists(extensionsPath))
            {
                return(null);
            }

            // try to load *.dll in bin\extensions\
            var files = Directory.EnumerateFiles(extensionsPath, "*.dll",
                                                 SearchOption.TopDirectoryOnly);
            List <iS3MenuItem> menuTreeItems = new List <iS3MenuItem>();

            foreach (string file in files)
            {
                // skip the assembly that has been loaded
                string shortName = Path.GetFileName(file);
                if (allAssemblies.Any(x => x.ManifestModule.Name == shortName))
                {
                    continue;
                }

                // Assembly.LoadFile doesn't resolve dependencies,
                // so don't use Assembly.LoadFile
                Assembly assembly = Assembly.LoadFrom(file);
                if (assembly != null)
                {
                    _loadedExtensions.Add(assembly);
                }
            }

            // call init() in extensions
            foreach (Assembly assembly in _loadedExtensions)
            {
                // call init() function in the loaded assembly
                var types = from type in assembly.GetTypes()
                            where type.IsSubclassOf(typeof(Extensions))
                            select type;
                foreach (var type in types)
                {
                    object     obj       = Activator.CreateInstance(type);
                    Extensions extension = obj as Extensions;
                    if (extension == null)
                    {
                        continue;
                    }
                    string msg = extension.init();
                    _mainFrame.output(msg);
                    // add menu
                    if (extension.menuItems() != null)
                    {
                        List <iS3MenuItem> menuitems = extension.menuItems().ToList();
                        menuTreeItems.AddRange(menuitems);
                    }
                }
                //save assembly by the dll name
                //
                if (assembly.FullName.Split(',').Length > 0)
                {
                    assemblyDict[assembly.FullName.Split(',')[0]] = assembly;
                }
            }
            return(menuTreeItems);
        }