private static AssemblyLoadContextBuilder CreateLoadContextBuilder(PluginConfig config) { var builder = new AssemblyLoadContextBuilder(); builder.SetMainAssemblyPath(config.MainAssemblyPath); builder.SetDefaultContext(config.DefaultContext); foreach (var ext in config.PrivateAssemblies) { builder.PreferLoadContextAssembly(ext); } if (config.PreferSharedTypes) { builder.PreferDefaultLoadContext(true); } if (config.IsUnloadable || config.EnableHotReload) { builder.EnableUnloading(); } if (config.LoadInMemory) { builder.PreloadAssembliesIntoMemory(); builder.ShadowCopyNativeLibraries(); } builder.IsLazyLoaded(config.IsLazyLoaded); foreach (var assemblyName in config.SharedAssemblies) { builder.PreferDefaultLoadContextAssembly(assemblyName); } var baseDir = Path.GetDirectoryName(config.MainAssemblyPath); var assemblyFileName = Path.GetFileNameWithoutExtension(config.MainAssemblyPath); if (baseDir == null) { throw new InvalidOperationException("Could not determine which directory to watch. " + "Please set MainAssemblyPath to an absolute path so its parent directory can be discovered."); } var pluginRuntimeConfigFile = Path.Combine(baseDir, assemblyFileName + ".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); }
private static AssemblyLoadContextBuilder CreateLoadContextBuilder(PluginConfig config) { var builder = new AssemblyLoadContextBuilder(); builder.SetMainAssemblyPath(config.MainAssemblyPath); builder.SetDefaultContext(config.DefaultContext); foreach (var ext in config.PrivateAssemblies) { builder.PreferLoadContextAssembly(ext); } if (config.PreferSharedTypes) { builder.PreferDefaultLoadContext(true); } #if FEATURE_UNLOAD if (config.IsUnloadable || config.EnableHotReload) { builder.EnableUnloading(); } if (config.LoadInMemory) { builder.PreloadAssembliesIntoMemory(); builder.ShadowCopyNativeLibraries(); } #endif builder.IsLazyLoaded(config.IsLazyLoaded); foreach (var assemblyName in config.SharedAssemblies) { builder.PreferDefaultLoadContextAssembly(assemblyName); } #if !FEATURE_NATIVE_RESOLVER // In .NET Core 3.0, this code is unnecessary because the API, AssemblyDependencyResolver, handles parsing these files. var baseDir = Path.GetDirectoryName(config.MainAssemblyPath); var assemblyFileName = Path.GetFileNameWithoutExtension(config.MainAssemblyPath); var depsJsonFile = Path.Combine(baseDir, assemblyFileName + ".deps.json"); if (File.Exists(depsJsonFile)) { builder.AddDependencyContext(depsJsonFile); } var pluginRuntimeConfigFile = Path.Combine(baseDir, assemblyFileName + ".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 _); } #endif return(builder); }