using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Threading; using OpenTK; namespace Examples { public partial class ExampleLauncher : Form { /// /// The main entry point for the application. /// [STAThread] static void Main() { using (Form exampleLauncher = new ExampleLauncher()) { Application.EnableVisualStyles(); Application.Run(exampleLauncher); } } public ExampleLauncher() { InitializeComponent(); } private void listBox1_DoubleClick(object sender, EventArgs e) { if (listBox1.SelectedItem != null) { Type example = Assembly.GetExecutingAssembly().GetType( "Examples." + listBox1.SelectedItem.ToString().Replace(": ", ".").Replace(' ', '_'), true, true ); if (example.BaseType == typeof(GameWindow)) { // Start the GameWindow in a new thread - it runs its own message loop, and it would // interfere with the message loop of the ExampleLauncher. new Thread(Launch).Start(example); } else if (example.BaseType == typeof(Form)) { try { // In this we do not want a different thread: these examples rely on the Application.Idle // event, which would then be raised by both the ExampleLauncher thread *and* the new one! this.AddOwnedForm((Form)example.GetConstructor(Type.EmptyTypes).Invoke(null)); } catch (Exception expt) { MessageBox.Show( String.Format( "Stacktrace:{0}{1}{0}{0}Inner exception:{0}{2}", System.Environment.NewLine, expt.StackTrace, expt.InnerException ), expt.Message ); } } } } void Launch(object example) { try { (example as Type).InvokeMember("Launch", BindingFlags.InvokeMethod, null, null, null); } catch (Exception expt) { MessageBox.Show( String.Format( "Stacktrace:{0}{1}{0}{0}Inner exception:{0}{2}", System.Environment.NewLine, expt.StackTrace, expt.InnerException ), expt.Message ); } } public void ExampleLauncher_Load(object sender, EventArgs e) { SortedList sl = new SortedList(); // Get all examples Type[] types = Assembly.GetExecutingAssembly().GetTypes(); foreach (Type type in types) { if (type.GetInterface("IExample") != null) { sl.Add( (type.Namespace.Replace("Examples.", String.Empty) + ": " + type.Name).Replace('_', ' '), null ); } } foreach (string s in sl.Keys) listBox1.Items.Add(s); // Select first item if (listBox1.Items.Count > 0) { this.listBox1.SelectedIndex = 0; } } } }