/// <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; } }