evildictaitor said:
The complexity of this basically depends on how general a solution you want. If your updates are additive though, I would suggest you define an interface (IUpdate) with two methods (OnAppStart(CoreWindow app), OnAppShutdown()) - where CoreWindow is the main window of your application (which is initially named Form1 when you first started your application).

You then program your main (core) program so that during the load procedure, the main form looks through a directory and reflectively loads all dlls in a directory, loads all objects that implement IUpdate and calls their OnAppStart(CoreWindow app) or OnAppShutdown() respectively.

You can then code your addon-code, such as adding a new menu and form by creating a new solution that references your core library, creating the new form and creating an update stub that impelements OnAppStart(). The code in OnAppStart() should be able to hook into the menu of CoreWindow, which it recieves as an argument, and add a new menu item, complete with click event that launches your new form. 

Implementing OnAppShutdown() is suggested because you may want to introduce new shared resources (such as file handles, SQL connections, whatever) which should be properly closed during the app shutdown. Even if you don't need them now, you may need them in future, so don't leave this one out. It should be called during the OnClose() of the CoreWindow.

Distributing updates to your application is now as simple as dropping a new dll into the directory of updates.

If you want to have updates applied in order, you can add a unique update field (int) to the IUpdate interface, and have the core program call OnAppStartup() and OnAppShutdown() in order (oldest to most recent on startup, most recent to oldest on shutdown).

Hope this helps.

Thank you very much for your great reply. It's just what I've been looking for. I'm going to investigate IUpdate right now and see how to properly use all this stuff.

Thanks Again!
Anthony