构建MAF管道时自定义程序集解析

时间:2015-03-02 13:34:28

标签: c# .net appdomain maf system.addin

我正在开发需要支持插件不同程度隔离的系统。我选择了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项目不能包含在管道中,因为:

  1. 在加载My.PlugIn.AddIn期间出现问题 - 依赖项 无法找到My.AddIn.Shared(如果AddInViews包含单个dll 添加基础)
  2. 无法将透明代理转换为我的IContract类型 - (何时 colyLocal = true且AddInViews包含多个1 dll)
  3. 另外,值得一提的是My.PlugIn.AddIn中的单个类只用AddInBaseAttribute修饰,共享程序集没有单个类。

    因此,在这两种情况下都无法加载插件。 我希望通过自定义事件处理程序来解决问题

    AppDomain.CurrentDomain.AssemblyResolve
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve
    

    在调用AddInStore.Rebuild之前,但这只会影响我的主机应用程序正在破坏的域,并且不会影响由内部创建的dommain“外接程序模型发现工作者AD” System.AddIn.Hosting.AddInStore

    由于此类是静态的,因此无法覆盖域的创建。此外,它不提供任何允许我访问内部域解析错误的事件。 有没有办法注入我的自定义程序集解析规则或强制内部appDomain从我的主要部分继承解析事件?

0 个答案:

没有答案