public NetworkAssemblyLoadContext( IPluginLogger <T> logger, INetworkAssemblyLoaderOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider <T> hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider, IHttpClientFactory httpClientFactory, ITempPathProvider <T> tempPathProvider) : base( logger, options, hostFrameworkProvider, hostTypesProvider, remoteTypesProvider, dependencyPathProvider, probingPathsProvider, runtimePlatformContext, depsFileProvider, pluginDependencyResolver, nativeAssemblyUnloader, assemblyLoadStrategyProvider ) { this.httpClient = httpClientFactory.CreateClient(); this.baseUrl = options.BaseUrl; this.tempPathProvider = tempPathProvider; }
public DefaultAssemblyLoadContextWithNativeResolver( IAssemblyLoadOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider ) : base( options, hostFrameworkProvider, hostTypesProvider, remoteTypesProvider, dependencyPathProvider, probingPathsProvider, runtimePlatformContext, depsFileProvider, pluginDependencyResolver, nativeAssemblyUnloader, assemblyLoadStrategyProvider ) { }
public DefaultAssemblyLoaderWithNativeResolver( IPluginLogger <T> logger, IAssemblyLoadOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider <T> hostTypesProvider, IDowngradableDependenciesProvider <T> downgradableDependenciesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider) : base() { this.logger = logger; this.options = options; this.hostFrameworkProvider = hostFrameworkProvider; this.hostTypesProvider = hostTypesProvider; this.downgradableDependenciesProvider = downgradableDependenciesProvider; this.remoteTypesProvider = remoteTypesProvider; this.dependencyPathProvider = dependencyPathProvider; this.probingPathsProvider = probingPathsProvider; this.runtimePlatformContext = runtimePlatformContext; this.depsFileProvider = depsFileProvider; this.pluginDependencyResolver = pluginDependencyResolver; this.nativeAssemblyUnloader = nativeAssemblyUnloader; this.assemblyLoadStrategyProvider = assemblyLoadStrategyProvider; }
public NetworkAssemblyLoader( IPluginLogger <T> logger, INetworkAssemblyLoaderOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider <T> hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider, ITempPathProvider <T> tempPathProvider, IHttpClientFactory httpClientFactory ) { this.logger = logger; this.options = options; this.hostFrameworkProvider = hostFrameworkProvider; this.hostTypesProvider = hostTypesProvider; this.remoteTypesProvider = remoteTypesProvider; this.dependencyPathProvider = dependencyPathProvider; this.probingPathsProvider = probingPathsProvider; this.runtimePlatformContext = runtimePlatformContext; this.depsFileProvider = depsFileProvider; this.pluginDependencyResolver = pluginDependencyResolver; this.nativeAssemblyUnloader = nativeAssemblyUnloader; this.assemblyLoadStrategyProvider = assemblyLoadStrategyProvider; this.tempPathProvider = tempPathProvider; this.httpClientFactory = httpClientFactory; }
public DefaultAssemblyLoadContext( IAssemblyLoadOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider) { this.options = options; this.hostFrameworkProvider = hostFrameworkProvider; this.hostTypesProvider = hostTypesProvider; this.remoteTypesProvider = remoteTypesProvider; this.dependencyPathProvider = dependencyPathProvider; this.probingPathsProvider = probingPathsProvider; this.runtimePlatformContext = runtimePlatformContext; this.depsFileProvider = depsFileProvider; this.pluginDependencyResolver = pluginDependencyResolver; this.nativeAssemblyUnloader = nativeAssemblyUnloader; this.assemblyLoadStrategyProvider = assemblyLoadStrategyProvider; this.loadedNativeLibraries = new ConcurrentDictionary <string, IntPtr>(); }
public DefaultAssemblyLoaderWithNativeResolver( IAssemblyLoadOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider) { this.loadContext = new DefaultAssemblyLoadContextWithNativeResolver <T>( options, hostFrameworkProvider, hostTypesProvider, remoteTypesProvider, dependencyPathProvider, probingPathsProvider, runtimePlatformContext, depsFileProvider, pluginDependencyResolver, nativeAssemblyUnloader, assemblyLoadStrategyProvider ); this.assemblyLoadContextReference = new System.WeakReference(this.loadContext); }
public DefaultAssemblyLoadContext( IPluginLogger <T> logger, IAssemblyLoadOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider <T> hostTypesProvider, IDowngradableDependenciesProvider <T> downgradableDependenciesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider) #if NETCORE3_0 || NETCORE3_1 : base(options.UseCollectibleAssemblies) #endif { this.logger = logger; this.options = options; this.hostFrameworkProvider = hostFrameworkProvider; this.hostTypesProvider = hostTypesProvider; this.downgradableDependenciesProvider = downgradableDependenciesProvider; this.remoteTypesProvider = remoteTypesProvider; this.dependencyPathProvider = dependencyPathProvider; this.probingPathsProvider = probingPathsProvider; this.runtimePlatformContext = runtimePlatformContext; this.depsFileProvider = depsFileProvider; this.pluginDependencyResolver = pluginDependencyResolver; this.nativeAssemblyUnloader = nativeAssemblyUnloader; this.assemblyLoadStrategyProvider = assemblyLoadStrategyProvider; this.loadedNativeLibraries = new ConcurrentDictionary <string, IntPtr>(); this.loadedPlugins = new ConcurrentBag <string>(); this.assemblyReferences = new ConcurrentBag <WeakReference>(); }
// Use the ASP.NET Core DI system to inject these dependencies public PluginLoadOptions( IPluginLogger <T> logger, IAssemblyScanner <T> assemblyScanner, ISharedServicesProvider <T> sharedServicesProvider, IPluginTypesProvider <T> pluginTypesProvider, IPluginActivationContextProvider <T> pluginActivationContextProvider, IRemotePluginActivator <T> activator, IParameterConverter parameterConverter, IResultConverter resultConverter, IPluginAssemblyLoader <T> assemblyLoader, IPluginProxyCreator <T> proxyCreator, IHostTypesProvider <T> hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IRuntimePlatformContext runtimePlatformContext, IAssemblySelector <T> assemblySelector, IPluginSelector <T> pluginSelector ) { this.logger = logger; this.assemblyScanner = assemblyScanner; this.sharedServicesProvider = sharedServicesProvider; this.pluginTypesProvider = pluginTypesProvider; this.pluginActivationContextProvider = pluginActivationContextProvider; this.activator = activator; this.parameterConverter = parameterConverter; this.resultConverter = resultConverter; this.assemblyLoader = assemblyLoader; this.proxyCreator = proxyCreator; this.hostTypesProvider = hostTypesProvider; this.remoteTypesProvider = remoteTypesProvider; this.runtimePlatformContext = runtimePlatformContext; this.assemblySelector = assemblySelector; this.pluginSelector = pluginSelector; }
public NetworkAssemblyLoader( INetworkAssemblyLoaderOptions <T> options, IHostFrameworkProvider hostFrameworkProvider, IHostTypesProvider hostTypesProvider, IRemoteTypesProvider <T> remoteTypesProvider, IDependencyPathProvider <T> dependencyPathProvider, IProbingPathsProvider <T> probingPathsProvider, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, IPluginDependencyResolver <T> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider, ITempPathProvider <T> tempPathProvider, IHttpClientFactory httpClientFactory ) { this.loadContext = new NetworkAssemblyLoadContext <T>( options, hostFrameworkProvider, hostTypesProvider, remoteTypesProvider, dependencyPathProvider, probingPathsProvider, runtimePlatformContext, depsFileProvider, pluginDependencyResolver, nativeAssemblyUnloader, assemblyLoadStrategyProvider, httpClientFactory, tempPathProvider ); this.assemblyLoadContextReference = new System.WeakReference(this.loadContext); }
public FunctionPluginLoaderOptions( IPluginLoadOptions <IHelloPlugin> helloPluginLoadOptions, IPluginLogger <IHelloPlugin> pluginLogger, IPluginPathProvider <IHelloPlugin> pluginPathProvider, IHostTypesProvider <IHelloPlugin> hostTypesProvider, IRemoteTypesProvider <IHelloPlugin> remoteTypesProvider, IRuntimePlatformContext runtimePlatformContext, IHostFrameworkProvider hostFrameworkProvider, IDependencyPathProvider <IHelloPlugin> dependencyPathProvider, IProbingPathsProvider <IHelloPlugin> probingPathsProvider, IPluginDependencyResolver <IHelloPlugin> pluginDependencyResolver, INativeAssemblyUnloader nativeAssemblyUnloader, ITempPathProvider <IHelloPlugin> tempPathProvider, IAssemblyLoadStrategyProvider assemblyLoadStrategyProvider, IPluginServerOptions pluginServerOptions, IHttpClientFactory httpFactory) { this.helloPluginLoadOptions = helloPluginLoadOptions; this.pluginLogger = pluginLogger; this.pluginPathProvider = pluginPathProvider; this.hostTypesProvider = hostTypesProvider; this.remoteTypesProvider = remoteTypesProvider; this.runtimePlatformContext = runtimePlatformContext; this.hostFrameworkProvider = hostFrameworkProvider; this.dependencyPathProvider = dependencyPathProvider; this.probingPathsProvider = probingPathsProvider; this.pluginDependencyResolver = pluginDependencyResolver; this.nativeAssemblyUnloader = nativeAssemblyUnloader; this.tempPathProvider = tempPathProvider; this.assemblyLoadStrategyProvider = assemblyLoadStrategyProvider; this.pluginServerOptions = pluginServerOptions; this.httpFactory = httpFactory; }
protected virtual void Dispose(bool disposing) { if (!this.disposed && disposing) { this.disposing = true; GC.Collect(); GC.WaitForPendingFinalizers(); this.hostTypesProvider = null; this.remoteTypesProvider = null; this.dependencyPathProvider = null; this.probingPathsProvider = null; this.runtimePlatformContext = null; this.depsFileProvider = null; this.pluginDependencyResolver = null; this.pluginDependencyContext = null; this.assemblyLoadStrategy = null; // Unload any loaded native assemblies foreach (var nativeAssembly in this.loadedNativeLibraries) { this.nativeAssemblyUnloader.UnloadNativeAssembly(nativeAssembly.Key, nativeAssembly.Value); } this.loadedNativeLibraries = null; this.nativeAssemblyUnloader = null; } this.disposed = true; }
public PluginLoadOptionsBuilder <T> WithDefaultOptions(string pluginPath = null) { if (String.IsNullOrEmpty(pluginPath)) { pluginPath = Path.Join(GetLocalExecutionPath(), "Plugins"); } this.pluginPathProvider = new DefaultPluginPathProvider <T>(pluginPath); this.dependencyPathProvider = new DependencyPathProvider <T>(pluginPath); this.runtimePlatformContext = new RuntimePlatformContext(); this.ScanForAssemblies(composer => composer.WithDefaultOptions <DefaultAssemblyScanner <T>, DefaultAssemblyScannerOptions <T> >()); this.pluginAssemblyNameProvider = new PluginAssemblyNameProvider <T>($"{typeof(T).Name}.dll"); this.sharedServicesProvider = new DefaultSharedServicesProvider <T>(new ServiceCollection()); this.activator = new DefaultRemotePluginActivator <T>(this.sharedServicesProvider); this.proxyCreator = new PluginProxyCreator <T>(); // Use System.Text.Json in 3.0 #if NETCORE3_0 this.parameterConverter = new JsonSerializerParameterConverter(); this.resultConverter = new JsonSerializerResultConverter(); this.assemblyLoaderType = typeof(DefaultAssemblyLoaderWithNativeResolver <T>); #endif // Use Newtonsoft.Json in 2.1 #if NETCORE2_1 this.parameterConverter = new NewtonsoftParameterConverter(); this.resultConverter = new NewtonsoftResultConverter(); this.assemblyLoaderType = typeof(DefaultAssemblyLoader <T>); #endif this.assemblySelector = new DefaultAssemblySelector <T>(); this.assemblyLoadOptions = new DefaultAssemblyLoadOptions <T>( PluginPlatformVersion.Empty(), false, NativeDependencyLoadPreference.PreferInstalledRuntime); this.probingPathsProvider = new ProbingPathsProvider <T>(); var hostTypesProvider = new HostTypesProvider(); hostTypesProvider.AddHostType(typeof(Prise.Plugin.PluginAttribute)); // Add the Prise.Infrastructure assembly to the host types hostTypesProvider.AddHostType(typeof(ServiceCollection)); // Adds the BuildServiceProvider assembly to the host types this.hostTypesProvider = hostTypesProvider; var remoteTypesProvider = new RemoteTypesProvider <T>(); remoteTypesProvider.AddRemoteType(typeof(T)); // Add the contract to the remote types, so that we can have backwards compatibility this.remoteTypesProvider = remoteTypesProvider; this.pluginSelector = new DefaultPluginSelector <T>(); this.depsFileProviderType = typeof(DefaultDepsFileProvider <T>); this.pluginDependencyResolverType = typeof(DefaultPluginDependencyResolver <T>); // Typically used for downloading and storing plugins from the network, but it could be useful for caching local plugins as well this.tempPathProviderType = typeof(UserProfileTempPathProvider <T>); this.nativeAssemblyUnloaderType = typeof(DefaultNativeAssemblyUnloader); this.hostFrameworkProviderType = typeof(HostFrameworkProvider); return(this); }
protected virtual void Dispose(bool disposing) { if (!this.disposed && disposing) { this.runtimePlatformContext = null; } this.disposed = true; }
public static async Task <PluginDependencyContext> FromPluginAssemblyAsync <T>( IPluginLoadContext pluginLoadContext, IPluginLogger <T> pluginLogger, IHostFrameworkProvider hostFrameworkProvider, IEnumerable <Type> hostTypes, IEnumerable <string> hostAssemblies, IEnumerable <Type> downgradableTypes, IEnumerable <string> downgradablehostAssemblies, IEnumerable <Type> remoteTypes, IRuntimePlatformContext runtimePlatformContext, IDepsFileProvider <T> depsFileProvider, bool ignorePlatformInconsistencies) { var hostDependencies = new List <HostDependency>(); var remoteDependencies = new List <RemoteDependency>(); foreach (var type in hostTypes) { // Load host types from current app domain LoadAssemblyAndReferencesFromCurrentAppDomain(pluginLogger, type.Assembly.GetName(), hostDependencies, downgradableTypes, downgradablehostAssemblies); } foreach (var assemblyFileName in hostAssemblies) { // Load host types from current app domain LoadAssemblyAndReferencesFromCurrentAppDomain(pluginLogger, assemblyFileName, hostDependencies, downgradableTypes, downgradablehostAssemblies); } foreach (var type in remoteTypes) { remoteDependencies.Add(new RemoteDependency { DependencyName = type.Assembly.GetName() }); } var hostFramework = hostFrameworkProvider.ProvideHostFramwork(); var dependencyContext = await GetDependencyContextFromPluginAssemblyAsync(pluginLoadContext, depsFileProvider); var pluginFramework = dependencyContext.Target.Framework; CheckFrameworkCompatibility(hostFramework, pluginFramework, ignorePlatformInconsistencies); var pluginDependencies = GetPluginDependencies(dependencyContext); var resoureDependencies = GetResourceDependencies(dependencyContext); var platformDependencies = GetPlatformDependencies(dependencyContext, runtimePlatformContext.GetPlatformExtensions()); var pluginReferenceDependencies = GetPluginReferenceDependencies(dependencyContext); return(new PluginDependencyContext( pluginLoadContext, hostDependencies, remoteDependencies, pluginDependencies, pluginReferenceDependencies, resoureDependencies, platformDependencies)); }
public NetworkPluginDependencyResolver( IRuntimePlatformContext runtimePlatformContext, INetworkAssemblyLoaderOptions <T> options, IHttpClientFactory httpClientFactory, ITempPathProvider <T> tempPathProvider) : base(runtimePlatformContext) { this.options = options; this.httpClient = httpClientFactory.CreateClient(); this.tempPathProvider = tempPathProvider; }
protected virtual void Dispose(bool disposing) { if (!this.disposed && disposing) { this.disposing = true; GC.Collect(); GC.WaitForPendingFinalizers(); this.hostTypesProvider = null; this.remoteTypesProvider = null; this.dependencyPathProvider = null; this.probingPathsProvider = null; this.runtimePlatformContext = null; this.depsFileProvider = null; this.pluginDependencyResolver = null; this.pluginDependencyContext = null; this.assemblyLoadStrategy = null; if (this.assemblyReferences != null) { foreach (var reference in this.assemblyReferences) { // https://docs.microsoft.com/en-us/dotnet/standard/assembly/unloadability#use-collectible-assemblyloadcontext for (int i = 0; reference.IsAlive && (i < 10); i++) { GC.Collect(); GC.WaitForPendingFinalizers(); } } } this.loadedPlugins.Clear(); this.loadedPlugins = null; this.assemblyReferences.Clear(); this.assemblyReferences = null; // Unload any loaded native assemblies foreach (var nativeAssembly in this.loadedNativeLibraries) { this.nativeAssemblyUnloader.UnloadNativeAssembly(nativeAssembly.Key, nativeAssembly.Value); } this.loadedNativeLibraries = null; this.nativeAssemblyUnloader = null; this.options = null; } this.disposed = true; }
public DefaultPluginDependencyContextProvider(Func <IPlatformAbstraction> platformAbstractionFactory, Func <IRuntimePlatformContext> runtimePlatformContextFactory) { this.platformAbstraction = platformAbstractionFactory.ThrowIfNull(nameof(platformAbstractionFactory))(); this.runtimePlatformContext = runtimePlatformContextFactory.ThrowIfNull(nameof(runtimePlatformContextFactory))(); }
public DefaultAssemblyScannerOptions(IPluginPathProvider <T> pluginPathProvider, IRuntimePlatformContext runtimePlatformContext) { this.pluginPathProvider = pluginPathProvider; this.runtimePlatformContext = runtimePlatformContext; }
public DefaultPluginDependencyResolver(IRuntimePlatformContext runtimePlatformContext) { this.runtimePlatformContext = runtimePlatformContext; }
public static PluginLoadContext SetRuntimePlatformContext(this PluginLoadContext pluginLoadContext, IRuntimePlatformContext runtimePlatformContext) { pluginLoadContext.RuntimePlatformContext = runtimePlatformContext; return(pluginLoadContext); }
public DefaultPluginDependencyResolver(Func <IRuntimePlatformContext> runtimePlatformContextFactory) { this.runtimePlatformContext = runtimePlatformContextFactory.ThrowIfNull(nameof(runtimePlatformContextFactory))(); }
public PluginLoadOptionsBuilder <T> WithDefaultOptions(string pluginPath = null, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped) { if (String.IsNullOrEmpty(pluginPath)) { pluginPath = Path.Join(GetLocalExecutionPath(), "Plugins"); } this.priseServiceLifetime = serviceLifetime; this.loggerType = typeof(NullPluginLogger <T>); this.pluginPathProvider = new DefaultPluginPathProvider <T>(pluginPath); this.dependencyPathProvider = new DependencyPathProvider <T>(pluginPath); this.cacheOptions = CacheOptions <IPluginCache <T> > .ScopedPluginCache(); this.runtimePlatformContext = new RuntimePlatformContext(); this.ScanForAssemblies(composer => composer.WithDefaultOptions <DefaultAssemblyScanner <T>, DefaultAssemblyScannerOptions <T> >()); this.pluginAssemblyNameProvider = new PluginAssemblyNameProvider <T>($"{typeof(T).Name}.dll"); this.sharedServicesProvider = new DefaultSharedServicesProvider <T>(this.hostServices, this.sharedServices); this.pluginActivationContextProviderType = typeof(DefaultPluginActivationContextProvider <T>); this.pluginTypesProviderType = typeof(DefaultPluginTypesProvider <T>); this.activatorType = typeof(DefaultRemotePluginActivator <T>); this.proxyCreatorType = typeof(PluginProxyCreator <T>); this.parameterConverterType = typeof(JsonSerializerParameterConverter); this.resultConverterType = typeof(JsonSerializerResultConverter); this.assemblyLoaderType = typeof(DefaultAssemblyLoader <T>); #if NETCORE3_0 || NETCORE3_1 // Replace with 3.x loader this.assemblyLoaderType = typeof(DefaultAssemblyLoaderWithNativeResolver <T>); #endif this.assemblySelectorType = typeof(DefaultAssemblySelector <T>); this.assemblyLoadOptions = new DefaultAssemblyLoadOptions <T>( PluginPlatformVersion.Empty(), this.ignorePlatformInconsistencies, this.useCollectibleAssemblies, NativeDependencyLoadPreference.PreferInstalledRuntime ); this.probingPathsProviderType = typeof(ProbingPathsProvider <T>); var hostTypesProvider = new HostTypesProvider <T>(); hostTypesProvider.AddHostType(typeof(Prise.Plugin.PluginAttribute)); // Add the Prise.Infrastructure assembly to the host types hostTypesProvider.AddHostType(typeof(ServiceCollection)); // Adds the BuildServiceProvider assembly to the host types this.hostTypesProvider = hostTypesProvider; var downgradableDependenciesProvider = new DowngradableDependenciesProvider <T>(); downgradableDependenciesProvider.AddDowngradableType(typeof(Prise.Plugin.PluginAttribute)); // Add the Prise.Infrastructure assembly to the host types this.downgradableDependenciesProvider = downgradableDependenciesProvider; var remoteTypesProvider = new RemoteTypesProvider <T>(); remoteTypesProvider.AddRemoteType(typeof(T)); // Add the contract to the remote types, so that we can have backwards compatibility this.remoteTypesProvider = remoteTypesProvider; this.pluginSelectorType = typeof(DefaultPluginSelector <T>); this.depsFileProviderType = typeof(DefaultDepsFileProvider <T>); this.pluginDependencyResolverType = typeof(DefaultPluginDependencyResolver <T>); // Typically used for downloading and storing plugins from the network, but it could be useful for caching local plugins as well this.tempPathProviderType = typeof(UserProfileTempPathProvider <T>); this.nativeAssemblyUnloaderType = typeof(DefaultNativeAssemblyUnloader); this.hostFrameworkProviderType = typeof(HostFrameworkProvider); return(this); }