/// <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 }
/// <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)); } } }
/// <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(); } }