无论如何都有可以加载/卸载的ClassLibrary插件。我发现的唯一方法是使用AppDomain但由于插件无法使用主机API而失败了。
答案 0 :(得分:3)
是的,我已经用1.1 2.0和3.5做到了这一点。加上MS现在有MEF,这可能是你想要的。
答案 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