Beispiel #1
0
        /// <summary>
        /// Loads the plugin.
        /// </summary>
        /// <param name="pluginConfigPath">The plugin config path.</param>
        /// <returns>A ValueTask.</returns>
        public async ValueTask <IPlugins> LoadPlugin(string pluginConfigPath)
        {
            IPluginsLoadContext locadContext = null;

            try
            {
                var pluginConfig = jsonUtil.Get <PluginConfig>(pluginConfigPath);
                var pluginDir    = Path.GetDirectoryName(pluginConfigPath);
                var pluginPath   = Path.Combine(pluginDir, pluginConfig.AssemblyName);
                locadContext = pluginLoadContextProvider.CreateLoadContext(pluginPath);
                var assemably      = locadContext.LoadAssembly(new AssemblyName(Path.GetFileNameWithoutExtension(pluginPath)));
                var allPluginTypes = reflectorUtil.GetTypeOfAbsoluteBase(assemably, typeof(Plugins)).ToList();
                if (allPluginTypes.Count == 0)
                {
                    throw new Exception($"{pluginConfig.AssemblyName}请实现基于Plugins的插件类");
                }
                if (allPluginTypes.Count == 2)
                {
                    throw new Exception($"{ pluginConfig.AssemblyName}存在多个Plugins实现类");
                }
                var pluginType = allPluginTypes[0];
                var plugin     = (Plugins)objectFactory.Create(pluginType);
                SetPluginValues(pluginDir, pluginConfig, assemably, ref plugin);
                pluginContextDic.TryAdd(pluginConfig.Key, locadContext);
                return(plugin);
            }
            catch (Exception e)
            {
                log.LogError(e, e.Message);
                locadContext?.UnLoad();
                throw;
            }
        }