Ejemplo n.º 1
0
        public PluginLoadOptionsBuilder <T> IgnorePlatformInconsistencies(bool ignore = true)
        {
            if (this.assemblyLoadOptionsType != null || this.networkAssemblyLoaderOptionsType != null || this.assemblyLoader != null)
            {
                throw new PrisePluginException("Custom loaders and custom load options are not supported with IgnorePlatformInconsistencies(), please provide your own value for IgnorePlatformInconsistencies.");
            }

            if (this.assemblyLoadOptions != null)
            {
                this.assemblyLoadOptions = new DefaultAssemblyLoadOptions <T>(
                    this.assemblyLoadOptions.PluginPlatformVersion,
                    ignore,
                    this.assemblyLoadOptions.NativeDependencyLoadPreference);
            }

            if (this.networkAssemblyLoaderOptions != null)
            {
                this.networkAssemblyLoaderOptions = new DefaultNetworkAssemblyLoaderOptions <T>(
                    this.networkAssemblyLoaderOptions.BaseUrl,
                    this.networkAssemblyLoaderOptions.PluginPlatformVersion,
                    ignore,
                    this.networkAssemblyLoaderOptions.NativeDependencyLoadPreference);
            }

            return(this);
        }
Ejemplo n.º 2
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>();
 }
 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 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
         )
 {
 }
Ejemplo n.º 5
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>();
        }
 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);
 }
Ejemplo n.º 7
0
        public PluginLoadOptionsBuilder <T> WithLocalDiskAssemblyLoader(
            PluginPlatformVersion pluginPlatformVersion = null,
            bool useCollectibleAssemblies = true,
            NativeDependencyLoadPreference nativeDependencyLoadPreference = NativeDependencyLoadPreference.PreferInstalledRuntime
            )
        {
            if (pluginPlatformVersion == null)
            {
                pluginPlatformVersion = PluginPlatformVersion.Empty();
            }

            this.assemblyLoadOptions = new DefaultAssemblyLoadOptions <T>(
                pluginPlatformVersion,
                this.ignorePlatformInconsistencies,
                useCollectibleAssemblies,
                nativeDependencyLoadPreference
                );

#if NETCORE3_0 || NETCORE3_1
            return(this.WithAssemblyLoader <DefaultAssemblyLoaderWithNativeResolver <T> >());
#endif
#if NETCORE2_1
            return(this.WithAssemblyLoader <DefaultAssemblyLoader <T> >());
#endif
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
 public PluginLoadOptionsBuilder <T> UseCollectibleAssemblies(bool useCollectibleAssemblies)
 {
     this.useCollectibleAssemblies = useCollectibleAssemblies;
     this.assemblyLoadOptions      = new DefaultAssemblyLoadOptions <T>(
         PluginPlatformVersion.Empty(),
         false,
         this.useCollectibleAssemblies,
         NativeDependencyLoadPreference.PreferInstalledRuntime);
     return(this);
 }
Ejemplo n.º 10
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;
        }
Ejemplo n.º 11
0
        public PluginLoadOptionsBuilder <T> WithLocalDiskAssemblyLoader(
            PluginPlatformVersion pluginPlatformVersion = null,
            bool useCollectibleAssemblies = true,
            NativeDependencyLoadPreference nativeDependencyLoadPreference = NativeDependencyLoadPreference.PreferInstalledRuntime
            )
        {
            if (pluginPlatformVersion == null)
            {
                pluginPlatformVersion = PluginPlatformVersion.Empty();
            }

            this.assemblyLoadOptions = new DefaultAssemblyLoadOptions <T>(
                pluginPlatformVersion,
                false,
                useCollectibleAssemblies,
                nativeDependencyLoadPreference);

            return(this.WithAssemblyLoader <DefaultAssemblyLoaderWithNativeResolver <T> >());
        }
Ejemplo n.º 12
0
        public PluginLoadOptionsBuilder <T> WithLocalDiskAssemblyLoader(
            PluginPlatformVersion pluginPlatformVersion = null,
            NativeDependencyLoadPreference nativeDependencyLoadPreference = NativeDependencyLoadPreference.PreferInstalledRuntime
            )
        {
            if (pluginPlatformVersion == null)
            {
                pluginPlatformVersion = PluginPlatformVersion.Empty();
            }

            this.assemblyLoadOptions = new DefaultAssemblyLoadOptions <T>(
                pluginPlatformVersion,
                false,
                nativeDependencyLoadPreference);

#if NETCORE3_0
            return(this.WithAssemblyLoader <DefaultAssemblyLoaderWithNativeResolver <T> >());
#endif
#if NETCORE2_1
            return(this.WithAssemblyLoader <DefaultAssemblyLoader <T> >());
#endif
        }
Ejemplo n.º 13
0
        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);
        }