Exemplo n.º 1
0
        /// <summary>
        /// Create a plugin loader for an assembly file.
        /// </summary>
        /// <param name="assemblyFile">The file path to the plugin config.</param>
        /// <param name="loaderOptions">Options for the loader</param>
        /// <returns>A loader.</returns>
        public static PluginLoader CreateFromAssemblyFile(string assemblyFile, PluginLoaderOptions loaderOptions)
        {
            var config  = new FileOnlyPluginConfig(assemblyFile);
            var baseDir = Path.GetDirectoryName(assemblyFile);

            return(new PluginLoader(config, baseDir, Array.Empty <Type>(), loaderOptions, null));
        }
Exemplo n.º 2
0
 internal PluginLoader(PluginConfig config,
                       string baseDir,
                       Type[] sharedTypes,
                       PluginLoaderOptions loaderOptions)
 {
     _mainAssembly = Path.Combine(baseDir, config.MainAssembly.Name + ".dll");
     _context      = CreateLoadContext(baseDir, config, sharedTypes, loaderOptions);
 }
Exemplo n.º 3
0
        private static AssemblyLoadContext CreateLoadContext(
            string baseDir,
            PluginConfig config,
            Type[] sharedTypes,
            PluginLoaderOptions loaderOptions)
        {
            var depsJsonFile = Path.Combine(baseDir, config.MainAssembly.Name + ".deps.json");

            var builder = new AssemblyLoadContextBuilder();

            if (File.Exists(depsJsonFile))
            {
                builder.AddDependencyContext(depsJsonFile);
            }

            builder.SetBaseDirectory(baseDir);

            foreach (var ext in config.PrivateAssemblies)
            {
                builder.PreferLoadContextAssembly(ext);
            }

            if (loaderOptions.HasFlag(PluginLoaderOptions.PreferSharedTypes))
            {
                builder.PreferDefaultLoadContext(true);
            }

#if FEATURE_UNLOAD
            if (loaderOptions.HasFlag(PluginLoaderOptions.IsUnloadable))
            {
                builder.EnableUnloading();
            }
#endif

            if (sharedTypes != null)
            {
                foreach (var type in sharedTypes)
                {
                    builder.PreferDefaultLoadContextAssembly(type.Assembly.GetName());
                }
            }

            var pluginRuntimeConfigFile = Path.Combine(baseDir, config.MainAssembly.Name + ".runtimeconfig.json");

            builder.TryAddAdditionalProbingPathFromRuntimeConfig(pluginRuntimeConfigFile, includeDevConfig: true, out _);

            // Always include runtimeconfig.json from the host app.
            // in some cases, like `dotnet test`, the entry assembly does not actually match with the
            // runtime config file which is why we search for all files matching this extensions.
            foreach (var runtimeconfig in Directory.GetFiles(AppContext.BaseDirectory, "*.runtimeconfig.json"))
            {
                builder.TryAddAdditionalProbingPathFromRuntimeConfig(runtimeconfig, includeDevConfig: true, out _);
            }

            return(builder.Build());
        }
Exemplo n.º 4
0
        /// <summary>
        /// Based on https://github.com/natemcmaster/DotNetCorePlugins/blob/master/src/Plugins/PluginLoader.cs
        /// </summary>
        public static AssemblyLoadContext CreateLoadContext(string baseDir,
                                                            AssemblyName mainAssemblyName,
                                                            PluginLoaderOptions loaderOptions = PluginLoaderOptions.None,
                                                            IEnumerable <AssemblyName> preferDefaultLoadContextForAssemblies = null,
                                                            IEnumerable <AssemblyName> privateAssemblies = null)
        {
            var depsJsonFile = Path.Combine(baseDir, mainAssemblyName.Name + ".deps.json");

            var builder = new AssemblyLoadContextBuilder();

            if (File.Exists(depsJsonFile))
            {
                builder.AddDependencyContextWithCompileDeps(depsJsonFile);
            }

            builder.SetBaseDirectory(baseDir);

            if (privateAssemblies != null)
            {
                foreach (var ext in privateAssemblies)
                {
                    builder.PreferLoadContextAssembly(ext);
                }
            }

            if (loaderOptions.HasFlag(PluginLoaderOptions.PreferSharedTypes))
            {
                builder.PreferDefaultLoadContext(true);
            }

            if (preferDefaultLoadContextForAssemblies != null)
            {
                foreach (var assemblyName in preferDefaultLoadContextForAssemblies)
                {
                    builder.PreferDefaultLoadContextAssembly(assemblyName);
                }
            }

            var pluginRuntimeConfigFile = Path.Combine(baseDir, mainAssemblyName.Name + ".runtimeconfig.json");

            builder.TryAddAdditionalProbingPathFromRuntimeConfig(pluginRuntimeConfigFile, true, out _);

            foreach (var runtimeconfig in Directory.GetFiles(AppContext.BaseDirectory, "*.runtimeconfig.json"))
            {
                builder.TryAddAdditionalProbingPathFromRuntimeConfig(runtimeconfig, true, out _);
            }

            return(builder.Build());
        }
Exemplo n.º 5
0
        private static AssemblyLoadContext CreateLoadContext(
            string baseDir,
            PluginConfig config,
            Type[] sharedTypes,
            PluginLoaderOptions loaderOptions)
        {
            var depsJsonFile = Path.Combine(baseDir, config.MainAssembly.Name + ".deps.json");

            var builder = new AssemblyLoadContextBuilder();

            if (File.Exists(depsJsonFile))
            {
                builder.AddDependencyContext(depsJsonFile);
            }

            builder.SetBaseDirectory(baseDir);

            foreach (var ext in config.PrivateAssemblies)
            {
                builder.PreferLoadContextAssembly(ext);
            }

            if (loaderOptions.HasFlag(PluginLoaderOptions.PreferSharedTypes))
            {
                builder.PreferDefaultLoadContext(true);
            }

            if (sharedTypes != null)
            {
                foreach (var type in sharedTypes)
                {
                    builder.PreferDefaultLoadContextAssembly(type.Assembly.GetName());
                }
            }

            var runtimeConfigFile = Path.Combine(baseDir, config.MainAssembly.Name + ".runtimeconfig.json");

            builder.TryAddAdditionalProbingPathFromRuntimeConfig(runtimeConfigFile, includeDevConfig: true, out _);

            return(builder.Build());
        }
Exemplo n.º 6
0
 public static PluginLoader CreateFromAssemblyFile(string assemblyFile, Type[] sharedTypes, PluginLoaderOptions loaderOptions)
 => CreateFromAssemblyFile(assemblyFile, sharedTypes, o =>
 {
     o.PreferSharedTypes = loaderOptions.HasFlag(PluginLoaderOptions.PreferSharedTypes);
 });
Exemplo n.º 7
0
        /// <summary>
        /// Create a plugin loader for an assembly file.
        /// </summary>
        /// <param name="assemblyFile">The file path to the plugin config.</param>
        /// <param name="sharedTypes">A list of types which should be shared between the host and the plugin.</param>
        /// <param name="loaderOptions">Options for the loader</param>
        /// <returns>A loader.</returns>
        public static PluginLoader CreateFromAssemblyFile(string assemblyFile, Type[] sharedTypes, PluginLoaderOptions loaderOptions)
        {
            var config  = new FileOnlyPluginConfig(assemblyFile);
            var baseDir = Path.GetDirectoryName(assemblyFile);

            return(new PluginLoader(config, baseDir, sharedTypes, loaderOptions));
        }