private void ReadConfiguration(PlugInConfiguration configuration, HashSet <string> loadedAssemblies) { if (!this.knownPlugIns.ContainsKey(configuration.TypeId)) { if (!string.IsNullOrEmpty(configuration.ExternalAssemblyName) && !loadedAssemblies.Contains(configuration.ExternalAssemblyName.ToLower())) { loadedAssemblies.Add(configuration.ExternalAssemblyName.ToLower()); try { var assembly = Assembly.LoadFile("plugins\\" + configuration.ExternalAssemblyName); this.DiscoverAndRegisterPlugIns(assembly); } catch (Exception e) { Log.Error($"Error while loading external plugin assembly {configuration.ExternalAssemblyName} for plugin {configuration.TypeId}.", e); return; } } else if (!string.IsNullOrEmpty(configuration.CustomPlugInSource)) { Assembly customPlugInAssembly = this.CompileCustomPlugInAssembly(configuration); this.DiscoverAndRegisterPlugIns(customPlugInAssembly); } else { // nothing we can do } } if (this.knownPlugIns.TryGetValue(configuration.TypeId, out Type plugInType)) { if (!configuration.IsActive) { this.DeactivatePlugIn(plugInType); } } else { Log.Warn($"Unknown plugin type for id {configuration.TypeId}"); } }
/// <summary> /// Gets the configuration. /// </summary> /// <typeparam name="T">The custom configuration type.</typeparam> /// <param name="configuration">The configuration.</param> /// <returns> /// The custom configuration as <typeparamref name="T" />. /// </returns> public static T GetConfiguration <T>(this PlugInConfiguration configuration) where T : class { if (string.IsNullOrWhiteSpace(configuration.CustomConfiguration)) { return(default);
private Assembly CompileCustomPlugInAssembly(PlugInConfiguration configuration) { var syntaxTree = SyntaxFactory.ParseSyntaxTree(configuration.CustomPlugInSource); return(syntaxTree.CompileAndLoad($"CustomPlugIn_{configuration.TypeId}")); }
/// <summary> /// Initializes a new instance of the <see cref="PlugInConfigurationChangedEventArgs"/> class. /// </summary> /// <param name="plugInType">Type of the plug in.</param> /// <param name="configuration">The changed configuration.</param> public PlugInConfigurationChangedEventArgs(Type plugInType, PlugInConfiguration configuration) : base(plugInType) { this.Configuration = configuration; }