我有一个“前端”表单应用程序。
在我的应用程序中,用户可以从不同的目录中选择外部 dll 程序集:
plugins_repository_directory
|
| first_item_directory
| Plugin.dll
| ...
|
| second_item_directory
| Plugin.dll
| ...
|
| last_item_directory
| Plugin.dll
所有外部程序集都具有相同的命名空间和一些共同特征:
每个“插件”都有一个 UserControl.EntryPointView 类和一个静态 PluginInfos 类。
好的
当用户从文件系统中选择插件时,我执行以下操作:
public void LoadPlugin(string fileName){
myPlugin= Assembly.LoadFile(fileName) //remember to use LoadFile instead of Load
Type entryPointViewType= myPlugin.GetType("Plugin.EntryPointView");
UserControl myPluginView (UserControl)Activator.CreateInstance(entryPointViewType);
myFrontendPanel.Controls.add(myPluginView);
((IEntryPointView)myPluginView).initialize(Stuff somestuff);
//and so on...
}
现在用户可以在前端面板中加载他的插件.. 非常好
一段时间后,用户想要加载不同的插件,因此他选择了不同的 dll 文件,基本上我处理旧的 EntryPointView 实例并再次运行 LoadPlugin()。
我想你正在理解我想要实现的目标:各种插件程序集具有相同的名称/命名空间,因为我想通过复制过去的插件项目快速构建新插件 -> 添加/删除/更改功能 -> 构建为 dll ->等等
现在这对我来说似乎是合法的,但我不是很有经验的建筑师,所以我想问一些问题:
- 我做对了吗?
- 有没有更好更简单的方法来实现我的目标?
- 我的建筑下面有什么鬼鬼祟祟的陷阱吗?
- 当用户选择另一个时,有没有办法从内存旧插件程序集中“卸载”?
先感谢您