Example #1
0
        /// <summary>
        /// 在运行时,根据需要加载某个程序集对应的插件。
        /// 该插件需要在配置文件中提前进行配置。
        /// </summary>
        /// <param name="assembly"></param>
        public static void LoadPlugin(Assembly assembly)
        {
            //已经加载过的插件,不再加载。
            if (_allPlugins.Find(assembly) != null)
            {
                return;
            }

            PluginType    pluginType  = PluginType.Domain;
            IPluginConfig pluginFound = null;

            //domain plugins.
            IPluginConfig[] configPlugins = GetDomainPluginsConfig();
            for (int i = 0, c = configPlugins.Length; i < c; i++)
            {
                var pluginSection = configPlugins[i];
                if (pluginSection.LoadType == PluginLoadType.AtStartup)
                {
                    continue;
                }

                if (IsPluginOfAssembly(pluginSection.Plugin, assembly))
                {
                    pluginFound = pluginSection;
                    break;
                }
            }

            //ui plugins.
            if (pluginFound == null && _location.IsUI)
            {
                configPlugins = GetUIPluginsConfig();
                for (int i = 0, c = configPlugins.Length; i < c; i++)
                {
                    var pluginSection = configPlugins[i];
                    if (pluginSection.LoadType == PluginLoadType.AtStartup)
                    {
                        continue;
                    }

                    if (IsPluginOfAssembly(pluginSection.Plugin, assembly))
                    {
                        pluginFound = pluginSection;
                        pluginType  = PluginType.UI;
                        break;
                    }
                }
            }

            if (pluginFound == null)
            {
                throw new InvalidProgramException($"插件 {assembly.GetName().Name } 需要在配置文件中提前进行配置。");
            }

            LoadRuntimePlugin(pluginFound.Plugin, pluginType, false);
        }