Beispiel #1
0
 /// <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);
     }
 }
Beispiel #2
0
 /// <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));
        }
Beispiel #4
0
 /// <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);
     }
 }
Beispiel #5
0
 /// <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);
 }