gpt4 book ai didi

.net - 是否可以用 "weak"引用替换对强名称程序集的引用?

转载 作者:行者123 更新时间:2023-12-03 14:16:15 27 4
gpt4 key购买 nike

我正在编写一个需要 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:我知道以下重复项:

  • c# - can you make a “weak” assembly reference to a strong named assembly
  • Need a C# Assembly to reference a strongly named assembly loosely

  • 然而,提供的解决方案并不适用。在问题 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com