示例#1
0
        /// <summary>
        /// Unloads the <paramref name="plugins"/> that were loaded into this application domain.
        /// </summary>
        private void UnloadPlugins()
        {
            // unload plugins in reverse order
            foreach (var plugin in loadedPlugins.Reverse <IPlugin>())
            {
                plugin.OnUnload();
            }
            loadedPlugins.Clear(); // remove all plugins once unloaded

            foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(plugins.Where(x => x.PluginState != PluginState.Disabled)))
            {
                desc.Unload();
                OnPluginUnloaded(new PluginInfrastructureEventArgs(desc));
            }
            plugins.Clear(); // remove all plugin descriptions once unloaded
        }
示例#2
0
        /// <summary>
        /// Runs the application declared in <paramref name="appInfo"/>.
        /// This is a synchronous call. When the application is terminated all plugins are unloaded.
        /// </summary>
        /// <param name="appInfo">Description of the application to run</param>
        internal void Run(ApplicationDescription appInfo, ICommandLineArgument[] args)
        {
            IApplication runnablePlugin = (IApplication)Activator.CreateInstance(appInfo.DeclaringAssemblyName, appInfo.DeclaringTypeName).Unwrap();

            try {
                runnablePlugin.Run(args);
            }
            finally {
                // unload plugins in reverse order
                foreach (var plugin in loadedPlugins.Reverse <IPlugin>())
                {
                    plugin.OnUnload();
                }
                foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(plugins.Where(x => x.PluginState != PluginState.Disabled)))
                {
                    desc.Unload();
                    OnPluginUnloaded(new PluginInfrastructureEventArgs(desc));
                }
            }
        }
示例#3
0
 /// <summary>
 /// Loads the <paramref name="plugins"/> into this application domain.
 /// </summary>
 /// <param name="plugins">Enumerable of plugins that should be loaded.</param>
 private void LoadPlugins(IEnumerable <PluginDescription> plugins)
 {
     // load all loadable plugins (all dependencies available) into the execution context
     foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(plugins.Where(x => x.PluginState != PluginState.Disabled)))
     {
         foreach (string fileName in desc.AssemblyLocations)
         {
             // load assembly reflection only first to get the full assembly name
             var reflectionOnlyAssembly = Assembly.ReflectionOnlyLoadFrom(fileName);
             // load the assembly into execution context using full assembly name
             var asm = Assembly.Load(reflectionOnlyAssembly.FullName);
             RegisterLoadedAssembly(asm);
             // instantiate and load all plugins in this assembly
             foreach (var plugin in GetInstances <IPlugin>(asm))
             {
                 plugin.OnLoad();
                 loadedPlugins.Add(plugin);
             }
         }
         OnPluginLoaded(new PluginInfrastructureEventArgs(desc));
         desc.Load();
     }
 }