C# 加载/卸载插件

3
有没有一种方法可以加载/卸载ClassLibrary插件。我发现唯一的方法是使用AppDomain,但这违背了目的,因为插件无法使用宿主 API。

2
你能解释一下“插件无法使用主机API”的意思吗? - Jacob
如果插件引用了主机,那么当您在另一个AppDomain中加载它时,我假设它会再次在该AppDomain中加载主机,因为没有设置任何内容。 - Will
3个回答

3

1
当你说“插件无法使用主机API”时,是否意味着你需要插件访问其主机的代码?如果是这样,那么听起来你想要循环依赖项,无论你的代码是动态可加载/卸载还是不可加载/卸载都是不允许的。如果插件需要访问主机的API,则应从该API中提取接口,并将其放置在一个共享库中,以便插件和主机应用程序均可访问:
Plugin -> PluginLib <- Host

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

1

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

这意味着您可以将来自程序集 A 的类型实例注入到新的 appdomain 中,其中它加载程序集 B。然后,B 可以使用来自程序集 A 的实例与主 appdomain 进行通信。只要您不将任何类型从程序集 B “越过边界”,您就可以卸载 appdomain 并从内存中删除程序集 B。

查看 MarshalByRefObject 以获取有关通过 AppDomain 边界传递实例的更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接