在 .Net 中不能做的一件事是在加载后从 AppDomain 中卸载 DLL。如果不同的插件使用具有不同 API 签名的不同版本的 3rd 方 DLL,您可能想要这样做(例如)。MAF 可以通过为每个 AddIn 实例化一个新的 AppDomain 来支持这一点 - 每个 AppDomain 都有自己的第 3 方 DLL 版本。
这就是为什么您需要在每个 AddIn 文件夹中拥有一个单独的第 3 方 DLL 副本:允许您将每个 AddIn 与其他 AddIn 中的实现或依赖项的更改隔离开来。
然而,答案也部分取决于 .Net 如何解决程序集依赖项以及您如何激活插件。
.Net 将在其中使用类型(不包括 GAC)的 AppDomain 的 BaseDirectory 和 PrivateBinPath 中探测程序集依赖项。
当您激活插件时,它是在 AppDomain 内完成的。如果您不指定一个,您将为每个 AddIn 获得一个新的 AppDomain,并且该 AppDomain 将 BaseDir 设置为 AddIn 文件夹 - 因此将在那里找到第 3 方 DLL。
如果您确实指定了 AppDomain,则将在该 appdomain 的 BaseDir 和 PrivateBinPath 中查找依赖程序集。这可以完全忽略 AddIn 文件夹中的任何第 3 方 DLL!
请记住,MAF 也有关于 AddIn 目录结构的时髦规则 - 它甚至禁止 AddIn 视图 DLL 在 AddIn 目录本身中。
我得出的结论是,为了支持 AddIn 的所有不同激活模式,AddIn 文件夹中应该只有一个DLL。我们正在更新我们的构建过程,以将所有依赖的 DLL 合并到 AddIn dll 中,包括附属程序集、Sgen 序列化 DLL 以及第 3 方 DLL。
考虑到这一点,也许您应该考虑解决构建过程中的“重复 DLL”问题?