2011-05-16 145 views
3

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

+2

你能解释一下你所说的“插件无法使用主机API。”是什么意思? – Jacob 2011-05-16 20:28:41

+0

如果插件引用了主机,那么当您将其加载到另一个AppDomain中时,我假设它再次在该AppDomain中加载主机,因为没有设置任何内容。 – Will 2011-05-16 20:34:58

回答

1

当你说“插件无法使用主机API,”你的意思是你需要你的插件来访问他们的主机的代码?如果是这样,那听起来就像是想要一个循环依赖,这是不允许的,不管你的代码是否可动态加载/不加载。如果插件需要访问主机的API,你应该提取接口的是API,并把它放在一个共享库,这两个插件和主机应用程序可以访问:

Plugin -> PluginLib <- Host 

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

1

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

这意味着您可以将程序集A中的类型实例注入到装入程序集B的新AppDomain中.B然后可以使用程序集A中的实例与主AppDomain进行交谈。只要你不从组件B'通过边界'传递任何类型,你就可以卸载appdomain并从内存中移除组件B.

看看在MarshalByRefObject约传球情况下对应用程序域边界

更多信息