Beispiel #1
0
        private void Add(ConcurrentDictionary <Type, List <IExtension> > extensions, IExtension extension)
        {
            Trace.Verbose($"Registering extension: {extension.GetType().FullName}");
            List <IExtension> list = extensions.GetOrAdd(extension.ExtensionType, new List <IExtension>());

            extension.Initialize(HostContext);
            list.Add(extension);
        }
Beispiel #2
0
        public void Initialize(IExtension extension)
        {
            extension.Initialize();

            if (extension.IsRunning && !_extensionsRunning.Contains(extension))
            {
                _extensionsRunning.Add(extension);
            }
        }
Beispiel #3
0
        // Called when an extension node is added or removed
        private void OnExtensionChanged(object s, ExtensionNodeEventArgs args)
        {
            IExtension extension = (IExtension)args.ExtensionObject;

            if (args.Change == ExtensionChange.Add)
            {
                extension.Initialize();
            }
            else
            {
                extension.Uninitialize();
            }
        }
Beispiel #4
0
        private static void InitializeExtensions()
        {
            IEnumerable <Type> types = Assembly.GetExecutingAssembly().GetTypes()
                                       .Where(t => typeof(IExtension).IsAssignableFrom(t) && t.IsClass);

            foreach (Type type in types)
            {
                try
                {
                    IExtension instance = (IExtension)Activator.CreateInstance(type);
                    instance?.Initialize();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
        }
        /// <summary>
        /// Loads the extensions.
        /// </summary>
        /// <exception cref="ConfigurationItemMissingException"></exception>
        /// <exception cref="InvalidExtensionException">
        /// </exception>
        public void LoadExtensions()
        {
            IConfigurationSection[] extensionConfigurations = _config.GetSections(EXTENSION_CONFIGURATION_KEY).ToArray();
            if (extensionConfigurations.Length == 0)
            {
                return;
            }

            HashSet <IExtension> extensions = new HashSet <IExtension>();

            foreach (IConfigurationSection extensionConfiguration in extensionConfigurations)
            {
                string name = extensionConfiguration.Key;
                string path = _config.Get($"{extensionConfiguration.Path}:path");

                _logger.Debug($"Loading extension: {name}");

                if (string.IsNullOrEmpty(path) || !File.Exists(path))
                {
                    throw new ConfigurationItemMissingException($"{extensionConfiguration.Path}:path");
                }

                LoadAssembly(path, name);
            }

            foreach (var extensionType in _extensionTypes)
            {
                IExtension extension = Activator.CreateInstance(extensionType.Key.AsType(), extensionType.Value, _dependencyUtility) as IExtension;
                if (extension == null)
                {
                    throw new InvalidExtensionException(extensionType.Value, extensionType.Key.AssemblyQualifiedName);
                }

                extension.Initialize();

                extensions.Add(extension);
            }

            Extensions = extensions;
        }
        public bool Initialize(TextWriter writer)
        {
            byte[] moduleData;

            try
            {
                moduleData = File.ReadAllBytes(ModuleFilename);
            }
            catch (Exception ex)
            {
                writer.WriteLine($"Impossible to load file '{ModuleFilename}'");
                writer.WriteLine(ex);

                return(false);
            }

            try
            {
                Assembly = Assembly.Load(moduleData);
            }
            catch (Exception ex)
            {
                writer.WriteLine($"Impossible to load assembly '{ModuleFilename}'");
                writer.WriteLine(ex);

                return(false);
            }

            Type extensionType = typeof(IExtension);

            IEnumerable <Type> types = Assembly.GetTypes()
                                       .Where(x => extensionType.IsAssignableFrom(x))
                                       .Where(x => x.IsAbstract == false);

            var extensions = new List <ExtensionContainer>();

            foreach (Type type in types)
            {
                IExtension ext = null;

                try
                {
                    ext = (IExtension)Activator.CreateInstance(type);
                }
                catch (Exception ex)
                {
                    writer.WriteLine($"Impossible to load extention '{type.FullName}' from file '{ModuleFilename}'");
                    writer.WriteLine(ex);
                    continue;
                }

                try
                {
                    ext.Initialize(ModuleFilename);
                }
                catch (Exception ex)
                {
                    writer.WriteLine($"Extension '{ext.Name}' version '{ext.Version}' failed to initialize");
                    writer.WriteLine(ex);
                    continue;
                }

                extensions.Add(new ExtensionContainer(ext));
            }

            Extensions = extensions.ToArray();

            return(extensions.Count > 0);
        }