我正在编写一个需要 SQL Server SMO 库的 .NET 工具。我不在乎它是来自 Server 2005 (9.0)、2008 (10.0) 还是 2008 R2(可能是 10.5,没有检查)的版本。 SMO 库与 SQL Server 一起安装,因此我可以放心地假设在任何安装了 SQL Server 的系统上,也可以使用某些版本的 SMO 库。
不幸的是,SMO 库是强命名的:如果我在我的项目中添加对 SMO 9.0 的引用,如果客户系统上只有 SMO 10.0,它将失败 (FileNotFoundException
),反之亦然。
有没有办法告诉编译器任何版本的库都适合我? 还是我真的必须分发 3 个相同版本的工具,每个版本都编译成不同版本的 SMO?
免责声明:我知道 SMO 库(以及 SMO 库所需的库)可以重新分发。但是(a)一个纤薄的 100KB 独立 EXE 和(b)一个安装了一大堆先决条件的完整安装包之间存在很大差异。
免责声明 2:我知道以下重复项:
然而,提供的解决方案并不适用。在问题 1 中,开发人员可以控制引用的 DLL(我没有);在问题 2 中,开发人员可以控制目标系统(我也没有)。
最佳答案
据我所知,不可能消除对确切版本的依赖。这就是存在强名称的原因之一——以避免版本不匹配。程序集的内部结构甚至公共(public)接口(interface)都可能在版本之间发生变化,您会发现新版本与旧版本不向后兼容。因此,.NET 会查找编译期间使用的版本,以确保应用程序正常工作。
如果第三方决定他们的新版本向后兼容,并且如果他们将程序集部署到 GAC,他们可以添加 publisher policy这将自动重定向。
如果您决定要强制加载另一个程序集,您可以使用@chibacity 提到的方法或实现 AppDomain.CurrentDomain.AssemblyResolve
的处理程序。 .当 .NET 无法找到引用的程序集时会触发此事件,您可以实现自己的逻辑来找到它并通过调用 Assembly.LoadFrom
加载它.在这种情况下,加载哪个版本完全取决于您。
关于.net - 是否可以用 "weak"引用替换对强名称程序集的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874975/