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>(); }
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 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 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 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( 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>(); }
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 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)); }
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; }
private static async Task <DependencyContext> GetDependencyContextFromPluginAssemblyAsync <T>(IPluginLoadContext pluginLoadContext, IDepsFileProvider <T> depsFileProvider) { return(new DependencyContextJsonReader().Read(await depsFileProvider.ProvideDepsFile(pluginLoadContext))); }
private static DependencyContext GetDependencyContextFromPluginAssembly <T>(IPluginLoadContext pluginLoadContext, IDepsFileProvider <T> depsFileProvider) { return(new DependencyContextJsonReader().Read(depsFileProvider.ProvideDepsFile(pluginLoadContext).Result)); }