代码之家  ›  专栏  ›  技术社区  ›  JMarsch

设置加载插件程序集的专用路径

  •  4
  • JMarsch  · 技术社区  · 15 年前

    看起来像这样:

    MyAppFolder
    ----------->ThePluginFolder
    ----------------Assembly1
    ----------------Dependency1
    

    Dependency1出现问题(这是程序集1引用的程序集)。CLR找不到它。

    我已经读了一些关于Fusion的文章,看起来我可以通过用currentAppDomain.AppendPrivatePath设置一个私有路径来纠正这个问题。

    然而,在.NET4.0帮助中,他们说这个方法已经过时了。他们把我指向AppDomainSetup,但我不能用它来修改我当前的应用程序域。

    我考虑过的选择:

    1. 我可以手动循环Assembly1的引用,如果在插件文件夹中找到程序集,我可以手动加载它(似乎是我最好的选择,但我想确保我没有错过任何东西)

    2. 我可以钩住当前域的AssemblyResolve事件(但这看起来很奇怪——您返回了一个值)。这是否意味着它不是多播?我正在处理插件的一个方面(业务规则),如果我的应用程序的另一部分需要插件报告呢?我需要一个全局事件处理程序吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   JMarsch    15 年前

    谢谢你们的帮助,伙计们。在我的例子中,我发现最好的办法是在我的主应用程序目录中定位插件。虽然我可以使用Load()或LoadFrom()在单独的目录中加载程序集(它似乎可以工作),但后来我遇到了序列化问题(引用的程序集有需要序列化和反序列化的类)。

    我只找到了3种让动态加载的插件与序列化一起工作的方法:

    1. 使用CurrentDomain.AppendPrivatePath将路径添加到包含我的程序集的目录(此方法已过时)

    2. 钩住当前AppDomain中的ResolveAssembly事件(这本可以工作,但它被称为alot,我不想影响我的应用程序的性能——不过请注意,我还没有进行测量)。

    3. 把程序集放在我的主目录里(这是最简单的解决方案,反对这样做的唯一理由是目录结构没有我的其他选项那么整洁。所以,综合考虑。我走这条路。

        2
  •  1
  •   Darin Dimitrov    15 年前

    插件程序集通常是通过反射加载的 Assembly.LoadFrom

        3
  •  1
  •   cjk    15 年前