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