我正在开发需要支持插件不同程度隔离的系统。我选择了MAF,因为它符合我的需求,支持单独的进程隔离和开箱即用的AppDomain隔离。
以下示例使用单独的进程隔离:
AddInStore.Rebuild(path);
...
var ap = new AddInProcess();
ap.Start();
var addin = token.Activate<MyAddInBase>(ap, AddInSecurityLevel.FullTrust);
但是我在使MAF与主机和插件之间共享的库一起工作时遇到了问题。让我们假设,我有项目(有输出目录):
- My.MainApp -> /.
- My.AddIn.Hosting -> /.
- My.AddIn.Shared -> /.
- My.AddIn.Contract -> /contracts
- My.PlugIn.HostSideAdapter -> /HostSideAdapters
- My.PlugIn.PlugInSideAdapter -> /PlugInSideAdapter
- My.PlugIn.AddIn -> /AddInViews
- My.SamplePlugin -> /addins/SamplePlugin
参考文献
My.MainApp <- My.AddIn.Hosting (copy local = true)
My.AddIn.Hosting <- My.AddIn.Shared (copy local = true)
<- My.AddIn.Contract (copy local = false)
My.PlugIn.AddIn <- My.AddIn.Contract (copy local = false)
My.PlugIn.HostSideAdapter <- My.AddIn.Hosting (copy local = false)
<- My.AddIn.Contract (copy local = false)
My.PlugIn.PlugInSideAdapter <- My.PlugIn.AddIn (copy local = false)
<- My.AddIn.Contract (copy local = false)
My.SamplePlugin <- My.PlugIn.AddIn (copy local = false)
<- My.AddIn.Contract (copy local = false)
这给了我一个干净的构建,在每个管道目录中都有单个dll,一切正常,管道构建,有效和有效。
直到我添加有问题的一个:
My.AddIn.Shared <- My.AddIn.Contract (copy local = false)
My.AddIn.Hosting <- My.AddIn.Shared (copy local = false)
My.PlugIn.AddIn <- My.AddIn.Shared (copy local = false)
这引入了一个问题,因为My.PlugIn.AddIn项目不能包含在管道中,因为:
另外,值得一提的是My.PlugIn.AddIn中的单个类只用AddInBaseAttribute修饰,共享程序集没有单个类。
因此,在这两种情况下都无法加载插件。 我希望通过自定义事件处理程序来解决问题
AppDomain.CurrentDomain.AssemblyResolve
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve
在调用AddInStore.Rebuild之前,但这只会影响我的主机应用程序正在破坏的域,并且不会影响由内部创建的dommain“外接程序模型发现工作者AD” System.AddIn.Hosting.AddInStore
由于此类是静态的,因此无法覆盖域的创建。此外,它不提供任何允许我访问内部域解析错误的事件。 有没有办法注入我的自定义程序集解析规则或强制内部appDomain从我的主要部分继承解析事件?