如何在不锁定指定 DLL 版本的情况下编译库

How to compile a library without locking into specify DLL version

我正在开发一个开源 class 库 (MySqlBackup.NET),它可以与 3 个由不同开发人员开发的可选依赖项一起使用,但它们都具有相同的 命名空间 类型MySqlCommand.

我每次发布一个nuget包,我都需要根据它的特定依赖分别编译3次。

有没有一种方法可以编译不需要绑定(锁定)特定目标依赖项的库?如果存在任何包含所需 namespace 类型的依赖 dll,它将起作用。

而且,每次依赖发布新版本时,我都需要重新编译以匹配依赖的版本号并重新提交新的nuget包,但实际上我的代码没有变化class图书馆。

如何编译忽略依赖版本号的class库?

简短回答:不,不是您想要的方式;类型的标识(在 IL 中)由程序集 定义 完整的类型名称 - 你不能只说“这个类型名称,但是我不在乎来自哪里

您可能只依赖 DbCommand(或更一般地说:System.Data.Common 中的 API),而不是任何特定于提供者的类型;对于大多数 ADO.NET 工作来说这通常就足够了 除非 你迫切需要接触特定于提供者的 API,在这种情况下:你可能需要使用某种形式的运行时反射代码(如一个例子:Dapper 使用优化的反射来调整 Oracle 的 BindByName 行为,当它找到它时)。请注意,ADO.NET 也有一个提供者工厂模型,尽管使用起来不是很有趣。

另一种方法是拥有一个包含 common/shared 逻辑的核心库,以及 3 个都依赖于该核心库的附属库,并包含特定于提供者的方面(显然每个附属库也需要针对特定于提供者的 API 之一的包引用)。由于瞬态依赖项的工作方式,您的普通消费者随后只需要一个包引用到他们适当的特定于提供者的包,例如 MySqlBackup.Devart(命名很难!)。