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

标签 .net reference assemblies strongname

我正在编写一个需要 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/

    相关文章:

    .net - 如何将 ExpandoObject 序列化为属性/值对?

    azure - 等待\依赖于模块中父级中的资源

    c# - 加载程序集并使用不同的名称和扩展名复制它

    c# - 将外部程序集添加到 ASP.NET MVC 项目的常用方法是什么?

    wpf - 在 Kaxaml 中使用自定义 XML 命名空间引用外部 DLL

    asp.net - System.Json.DLL 在哪里?

    C# 2.0 代码使用使用 C# 3.0 编译的程序集

    .net - 为什么我本地 WCF 客户端的 IP 不是 127.0.0.1?

    c++ - 从函数交换并返回 Char 数组

    Java 字符串实例化