/// <summary> /// Include globs to look for plugin assemblies /// </summary> /// <param name="pluginBuilder">IPluginBuilder</param> /// <param name="pluginGlobs">string array</param> public static void IncludePlugins(this IPluginBuilder pluginBuilder, params string[] pluginGlobs) { foreach (var glob in pluginGlobs) { _ = pluginBuilder.PluginMatcher.AddInclude(glob); } }
/// <summary> /// Include globs to look for framework assemblies /// </summary> /// <param name="pluginBuilder">IPluginBuilder</param> /// <param name="frameworkGlobs">string array</param> public static void IncludeFrameworks(this IPluginBuilder pluginBuilder, params string[] frameworkGlobs) { foreach (var glob in frameworkGlobs) { _ = pluginBuilder.FrameworkMatcher.AddInclude(glob); } }
/// <summary> /// Helper method to load an assembly which contains plugins /// </summary> /// <param name="pluginBuilder">IPluginBuilder</param> /// <param name="pluginAssemblyLocation">string</param> /// <returns>IPlugin</returns> private static Assembly LoadPlugin(IPluginBuilder pluginBuilder, string pluginAssemblyLocation) { if (!File.Exists(pluginAssemblyLocation)) { // TODO: Log an error, how to get a logger here? return(null); } // This allows validation like AuthenticodeExaminer if (!pluginBuilder.ValidatePlugin(pluginAssemblyLocation)) { return(null); } // TODO: Log verbose that we are loading a plugin var pluginName = Path.GetFileNameWithoutExtension(pluginAssemblyLocation); // TODO: Decide if we rather have this to come up with the name: AssemblyName.GetAssemblyName(pluginLocation) var pluginAssemblyName = new AssemblyName(pluginName); if (AssemblyLoadContext.Default.TryGetAssembly(pluginAssemblyName, out _)) { return(null); } var loadContext = new PluginLoadContext(pluginAssemblyLocation, pluginName); return(loadContext.LoadFromAssemblyName(pluginAssemblyName)); }
/// <summary> /// Add a directory to scan both framework and plug-in assemblies /// </summary> /// <param name="pluginBuilder">IPluginBuilder</param> /// <param name="directories">string array</param> public static void AddScanDirectories(this IPluginBuilder pluginBuilder, params string[] directories) { foreach (var directory in directories) { var normalizedDirectory = Path.GetFullPath(directory); pluginBuilder.FrameworkDirectories.Add(normalizedDirectory); pluginBuilder.PluginDirectories.Add(normalizedDirectory); } }
/// <summary> /// Helper method to retrieve the plugin builder /// </summary> /// <param name="properties">IDictionary</param> /// <param name="pluginBuilder">IPluginBuilder out value</param> /// <returns>bool if there was a matcher</returns> private static bool TryRetrievePluginBuilder(this IDictionary <object, object> properties, out IPluginBuilder pluginBuilder) { if (properties.TryGetValue(PluginBuilderKey, out var pluginBuilderObject)) { pluginBuilder = (IPluginBuilder)pluginBuilderObject; return(true); } pluginBuilder = new PluginBuilder(); properties[PluginBuilderKey] = pluginBuilder; return(false); }