这里实际上有两种情况——使用强名称/GAC,或者不使用强名称。
如果您使用强名称并将组件安装到 GAC 中,那么 .Net 将希望使用客户端在编译时引用的组件版本。因此,在您的示例中,Project 很可能引用数据库 V2,而 Logging 引用数据库 V1,因为 DLL 可以并行存储在 GAC 中。因此,如果您确实希望 Logging 使用 V2 而不是 V1,则需要修改配置文件以说明“对 V1 的引用应该指向 V2”。有不同的地方可以做到这一点 - 应用程序文件,机器文件等。
如果您不使用强名称,那么 .Net 将默认使用与客户端位于同一文件夹中的 DLL 版本。因此,假设您将 Project、CommonControls 和 Logging 部署在与数据库 V2 相同的文件夹中。然后,即使 Logging 是针对数据库 V1 构建的,它也会尝试使用同一文件夹中的组件,即数据库 V2。只要 V2 可以提供 Logging 想要使用的相同公共类和方法,它就可以正常工作。
在我的环境中——我们所有的应用程序都是内部的——我们不使用 GAC。我们只是将应用程序需要的所有文件部署到一个文件夹中。当你有很多通用组件时,保持配置文件同步简直就是一场噩梦。
这与 COM 完全不同,COM 中所有应用程序都获取当前注册的 DLL 副本(假设 V1 和 V2 是二进制兼容的)。