C#如何以编程方式加载具有相同名称空间的外部程序集

时间:2018-07-18 10:56:17

标签: c# dll .net-assembly assembly.load external-assemblies

我有一个“前端”表单应用程序。

在我的应用程序中,用户可以从不同目录中选择外部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形式构建-> etvoilà

现在对我来说似乎合法,但我不是非常有经验的建筑师,所以我想问一些问题:

  • 我做对了吗?
  • 有没有更好,更简单的方法来实现自己的目标?
  • 我的建筑下面是否有一些偷偷摸摸的陷阱?
  • 当用户选择另一个插件时,是否可以从内存旧插件程序中“卸载”?

先谢谢您

0 个答案:

没有答案