#region License Information /* HeuristicLab * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HeuristicLab.PluginInfrastructure; using HeuristicLab.PluginInfrastructure.UI; namespace HeuristicLab { static class Program { [STAThread] /// /// Main entry point of the plugin infrastructure. Loads the starter form. /// /// Command line arguments static void Main(string[] args) { if ((!FrameworkVersionErrorDialog.NET4_5Installed && !FrameworkVersionErrorDialog.MonoInstalled) || (FrameworkVersionErrorDialog.MonoInstalled && !FrameworkVersionErrorDialog.MonoCorrectVersionInstalled)) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FrameworkVersionErrorDialog()); } else { try { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); string pluginPath = Path.GetFullPath(Application.StartupPath); var pluginManager = new PluginManager(pluginPath); var splashScreen = new SplashScreen("Loading plugins...", 3000); pluginManager.Initializing += (sender, eventArgs) => splashScreen.UpdateMessage("Loading plugins..."); pluginManager.PluginLoaded += (sender, eventArgs) => splashScreen.UpdateMessage("Loaded " + eventArgs.Entity.ToString()); pluginManager.ApplicationStarting += (sender, eventArgs) => splashScreen.UpdateMessage("Starting " + eventArgs.Entity.ToString()); pluginManager.ApplicationStarted += (sender, eventArgs) => splashScreen.UpdateMessage("Started " + eventArgs.Entity.ToString()); DiscoverPluginsAndRunOptimizerAsync(pluginManager, args); Application.Run(splashScreen); } catch (Exception ex) { MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private static void DiscoverPluginsAndRunOptimizerAsync(PluginManager pluginManager, string[] args) { // STAThread is necessary for a UI component we are using in the application var t = new Thread(() => { try { pluginManager.DiscoverAndCheckPlugins(); var optimizerApp = pluginManager.Applications.FirstOrDefault(app => app.Name == "Optimizer"); pluginManager.Run(optimizerApp, CommandLineArgumentHandling.GetArguments(args)); } catch (Exception ex) { MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); } }); // cannot use a task because we need to set STA t.SetApartmentState(ApartmentState.STA); t.Start(); } } }