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()); }
/// <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()); }
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()); }
public static PluginLoader CreateFromAssemblyFile(string assemblyFile, Type[] sharedTypes, PluginLoaderOptions loaderOptions) => CreateFromAssemblyFile(assemblyFile, sharedTypes, o => { o.PreferSharedTypes = loaderOptions.HasFlag(PluginLoaderOptions.PreferSharedTypes); });