【问题标题】:Plugin Situation: What to do with dependent libraries?插件情况:依赖库怎么办?
【发布时间】:2011-08-15 16:11:58
【问题描述】:

我有一个基于 MEF 的应用程序,它使用适配器来处理文件。它使用配置文件来确定要监视的目录以及使用哪个适配器来处理每种类型的文件。插件采用实现通用接口的 .dll 形式。

每个 .dll 都需要自己的一组依赖库。例如,plugin1.dll 可能需要使用 apilbrary.dll 和 xmllibrary.dll。也有可能在以后我可能想要添加 plugin2.dll,并且 plugin2.dll 也可能使用 xmllibrary.dll。这些依赖库会定期更新,所以我不能指望 plugin2.dll 使用与 plugin1.dll 中使用的完全相同版本的 xmllibrary.dll。

我想将每个插件编译成一个 .dll 文件,该文件在其自身内部不可见地包含其所有依赖库,这似乎是解决此问题的一种方法。或者,我想弄清楚每个 .dll 文件如何在子文件夹中查找其依赖库,我相信这也会减少版本冲突的可能性。或者,我什至没有考虑过这个问题的简单解决方案(这总是非常非常有可能)。

有什么想法吗?

【问题讨论】:

    标签: c# mef


    【解决方案1】:

    您可能应该尝试使其与标准 .NET 加载规则一起使用。但是,如果您确实需要准确控制程序集的加载方式以及加载哪些版本,这篇博文将展示如何:Using Loading contexts effectively

    【讨论】:

      【解决方案2】:

      我想您需要权衡可部署性与维护性。简单的解决方案是使用名为 ILMerge 的工具。 ILMerge 获取您的项目输出,并且可以获取其他程序集并将它们合并在一起。这使您能够包装插件所依赖的所有程序集,并将它们合并到一个程序集中。您可以选择使用您的公钥重新签名等操作。这是一个很好的阅读:Leveraging ILMerge to simplify deployment and your users experienceDaniel Cazzulino

      虽然这很好,但如果分发了引用程序集的新版本来纠正您嵌入的程序集的错误,会发生什么?根据 Fusions 程序集加载器的规则,当它从您引用的程序集中加载类型时,它会看到它们已经加载,因此没有理由加载更新版本。这意味着您需要重新编译插件并再次合并较新的引用程序集。

      我的问题是,确保使用特定版本真的重要吗?如果较新的版本提供了更新的实现(不会破坏向后兼容性),那么这肯定会使所有需要引用它的插件受益吗?

      关于程序集是如何相互引用加载的,请阅读Understanding .Net Assemblies and References,这是一个非常宝贵的信息。

      【讨论】:

      • 也许我的假设无效:如果我创建一个项目并使用某个依赖库的 v3 部署它,然后我删除 v3 .dll 并用 v4 替换它,不会会导致错误?
      • 这取决于引用的程序集是否是强命名的。强命名的程序集将强制使用确切的版本,除非被绑定重定向、策略文件等覆盖。如果程序集不是强命名的,它不保证它与存在的版本是相同的版本沿袭。您需要通过部署模型管理如何支持这一点。
      【解决方案3】:

      MEF 使用标准的 .NET 程序集加载,并且所有内容都加载到单个 AppDomain 中。您几乎无法控制依赖项的加载方式——因为它们只是在通过 MEF 注入程序集时由 CLR 自动加载。使用 MEF 时适用正常的 CLR 程序集加载规则,因此依赖项将被加载,就好像它们是您的应用程序的依赖项一样 - 无论它们位于或引用的位置。

      在大多数情况下,如果插件及其依赖项编写得当,您很可能无需担心这一点。只要依赖项中的版本控制正确,它就可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 2011-04-27
        • 2021-05-01
        • 2011-06-30
        • 2016-05-21
        • 1970-01-01
        • 2018-09-18
        相关资源
        最近更新 更多