ok here goes....
My app is very focused in what it does so it doesn't provide plugins in the Photoshop way of plugins in a way of it altering menu structures, buttons on toolbars etc although of course this would be easy enough to do.
Basically with the main app is an assembly which litterally only houses the plugin interface (it's 1k or something). The plugin assembly references this interface assembly when being created to create the class (obviously conforming to the interface). Now the finished plugin assembly whatever it is is placed in the apps plugin directory.
On App startup, it moves through every file in that directory. Here comes the reflection bit
Using Reflection I scan the potential plugin assembly for any classes that descend from the Interface class.
Once I've found one of those, I call one of the Interface functions (so it has to be there to conform to the interface as you know) which tells the app what capabilities the plugin is capable of performing (ie what sort of event should start this plugin) which I store in my main app.
It's in this function and how you store the details that you could add toolbars, menus etc.
So whenever a plugin needs to be invoked, I check my list of external plugins, open the appropriate assembly and create the necessary class and then run the appropriate method of that class to satisfy the app request.
I'm not so sure this mechanism would work for all types of plugin scenarios but for mine it works perfectly.
I wrote this same app in C++ and again in Delphi and in those instance of course Refelection wasn't possible so I had to use DLL's. It worked fine but having to create handles, function pointers, callbacks, loading and freeing the library was a lot more work. Also in the Dll scenario I was hitting every dll in the plugin directory with my 'are you a plugin?' query function which worked most times but of course you had to handle some exceptions for a non-plugin dll..not tough but again more work.
Also in the Reflection scenario I can query for exactly the class I'm interested in and because it's implmenting an interface I know exactly what it can and can't do and even if I had decided not to use an interface, I could have used reflection again to determine exactly what the plugin could do or not do...that's the beauty of it.
HTH