Exemple #1
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());
        }