コード例 #1
0
 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>();
 }
コード例 #2
0
        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;
        }
コード例 #3
0
 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;
 }
コード例 #4
0
 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;
 }
コード例 #5
0
ファイル: NetworkAssemblyLoader.cs プロジェクト: teksoi/Prise
 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;
 }
コード例 #6
0
 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
         )
 {
 }
コード例 #7
0
 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);
 }
コード例 #8
0
        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>();
        }
コード例 #9
0
 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);
 }
コード例 #10
0
        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));
        }
コード例 #11
0
        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;
        }
コード例 #12
0
 private static async Task <DependencyContext> GetDependencyContextFromPluginAssemblyAsync <T>(IPluginLoadContext pluginLoadContext, IDepsFileProvider <T> depsFileProvider)
 {
     return(new DependencyContextJsonReader().Read(await depsFileProvider.ProvideDepsFile(pluginLoadContext)));
 }
コード例 #13
0
 private static DependencyContext GetDependencyContextFromPluginAssembly <T>(IPluginLoadContext pluginLoadContext, IDepsFileProvider <T> depsFileProvider)
 {
     return(new DependencyContextJsonReader().Read(depsFileProvider.ProvideDepsFile(pluginLoadContext).Result));
 }