这是很有可能的,而且它并不特定于 WinForms。您需要一种方法来要求模块在某个时候将其 UI 提供给您。例如:您的模块将实现一个接口,并且它将有一个返回Panel的方法。当你调用它时,你可以在你的 UI 上用它做任何事情。
例如:您的右侧面板可以是可以托管面板的东西。
您的界面可能如下所示
interface IModule
{
...
Panel GetUI();
...
}
因此,当用户单击左窗格中的模块时,您将运行类似这样的操作。
var selectedModule = GetSelectedModule()
// this method will do the Reflection to load your assemblies,
// go through the Types, filter every type that implement IModule and load them.
// then get an instance of the module. (Let me know if you want help on Reflection)
if (!GetConfiguration().IsModuleEnables(selectedModule))
return; // module not enabled. Ignore click ???
rightPane.Children.Clear();
rightPane.Children.Add(selectedModule.GetUI());
// might want to dock the module as 'Fill' as well.
我认为您最好在应用程序中保持模块的“已激活”状态,而不是询问模块是否已启用(流氓模块可以一直返回 true。)
希望这可以帮助。
更新:为了保证安全,我建议您将模块加载到单独的AppDomain中。尽管您可能在它们之间传递 UI 对象时遇到问题。