插件情况:如何处理依赖库

本文关键字:处理 依赖 情况 何处理 插件 | 更新日期: 2023-09-27 18:05:33

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

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

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

任何想法吗?

插件情况:如何处理依赖库

您可能应该尝试让它与标准的。net加载规则一起工作。但是,如果您确实需要精确控制程序集的加载方式以及加载的版本,这篇博客文章将展示如何:

我猜您需要权衡可部署性与维护。简单的解决方案是使用一个名为ILMerge的工具。ILMerge接收您的项目输出,并可以接收其他程序集并将它们合并在一起。这使您能够包装插件所依赖的所有程序集,并将它们合并为单个程序集。您还可以选择使用公钥进行重新签名等操作。这里有一个很好的阅读:利用ILMerge来简化部署和用户体验,作者:Daniel Cazzulino。

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

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

至于程序集是如何在相互引用中加载的,请阅读理解。net程序集和引用,这是一个非常宝贵的信息。

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

在大多数情况下,如果插件和它们的依赖关系写得很好,你很可能不需要担心这个问题。只要依赖项中的版本控制是正确的,它就可能正常工作。