有没有一种方法可以加载/卸载ClassLibrary插件。我发现唯一的方法是使用AppDomain,但这违背了目的,因为插件无法使用宿主 API。
我已经用过1.1、2.0和3.5版本来实现这一点。另外,微软现在有了MEF,这可能是你想要的东西。
Plugin -> PluginLib <- Host
CLR 只能卸载整个 Appdomain,而不能卸载一个程序集。但是,在多个 appdomains 中加载同一个程序集没有问题。
这意味着您可以将来自程序集 A 的类型实例注入到新的 appdomain 中,其中它加载程序集 B。然后,B 可以使用来自程序集 A 的实例与主 appdomain 进行通信。只要您不将任何类型从程序集 B “越过边界”,您就可以卸载 appdomain 并从内存中删除程序集 B。
查看 MarshalByRefObject 以获取有关通过 AppDomain 边界传递实例的更多信息