C#加载/卸载插件

时间:2011-05-16 20:26:43

标签: c#

无论如何都有可以加载/卸载的ClassLibrary插件。我发现的唯一方法是使用AppDomain但由于插件无法使用主机API而失败了。

3 个答案:

答案 0 :(得分:3)

是的,我已经用1.1 2.0和3.5做到了这一点。加上MS现在有MEF,这可能是你想要的。

http://msdn.microsoft.com/en-us/magazine/ee291628.aspx

答案 1 :(得分:1)

当您说“该插件无法使用主机API”时,您是否意味着您需要使用插件来访问其主机代码?如果是这样,这听起来像是你想要一个循环依赖,不管你的代码是否是动态可加载/不可加载的。如果插件需要访问主机的API,您应该从该API中提取一个接口,并将其放在共享库中,插件和主机应用都可以访问:

Plugin -> PluginLib <- Host

然后主机可以将其API对象注入插件的属性/构造函数中,以便插件可以调用API方法。理想情况下,您的插件库应该不依赖于主机库。一旦您的依赖问题得到解决,使用AppDomain进行动态加载/卸载应该没问题。

答案 2 :(得分:1)

CLR只能卸载整个Appdomain,而不能卸载程序集。但是,在多个appdomains中加载相同的程序集没有问题。

这意味着您可以将程序集A中的类型实例注入到新的应用程序域中,然后加载程序集B.然后,B可以使用程序集A中的实例与主应用程序域进行通信。只要你没有从程序集B'通过边界传递任何类型',你就可以卸载appdomain并从内存中删除程序集B.

有关通过AppDomain边界传递实例的更多信息,请查看MarshalByRefObject