dll - 为什么我的 NuGet 包只能与特定版本的第三方库一起使用?

标签 dll dependencies nuget

我已经创建了一个扩展包 (AutoFixture),它实现了它的一个接口(interface),ICustomization .我发布了带有编译二进制文件的 NuGet 包,该二进制文件引用了 3.16 版的 AutoFixture。

当在包含对 AutoFixture 版本 3.18 的引用的项目中使用时,实现 ICustomization 的类接口(interface)无法使用。给出的编译错误是 MyCustomization is not assignable to ICustomization .

通过下载源代码并将其编译到我的扩展、更新 AutoFixture 引用并将其包含在新项目中,编译器错误消失了。

我原以为只有次要版本增量(保持向后兼容性)这不会成为问题。

为什么我的 NuGet 包只适用于这个版本的 AutoFixture,是否有可能在 NuGet 下发布一个二进制文件,它将适用于所有次要版本增量(即那些不破坏向后兼容性的增量)?

最佳答案

这是 .NET 中类型标识的结果。类型不仅由其命名空间名称和类型名称标识,还包括它来自的程序集。框架中称为“程序集限定类型名称”的东西。我可以用一个小示例程序来演示它:

using System;

class Program {
    static void Main(string[] args) {
        Console.WriteLine(typeof(IDisposable).AssemblyQualifiedName);
        Console.ReadLine();
    }
}

输出:

System.IDisposable, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

请注意 [AssemblyVersion] 是如何包含的。检查所有四个数字,版本 = 4.0.0.1 的类型不兼容并生成您收到的编译器错误消息。这就是对您的代码造成严重破坏的原因,作者修改了他的 Properties\AssemblyInfo.cs 文件,现在显示为:

 [assembly: AssemblyVersion("3.18.3.0")]

4 月 13 日从 AssemblyVersion("3.18.2.0") 更改。 3.18.2.0版本是4月12日签到的,只存活了一天:) 翻看历史,作者经常换版本,平均一个月换几次。版本 3.16.0.0 于 2013 年 11 月 30 日发布。从那以后他已经更改了 14 次。相比之下,Microsoft 在过去 9 年 中仅更改了一次 IDisposable 的版本号。

你当然不可能跟上。

你应该联系作者,让他知道这件事。不过可能很难说服他。您需要使用绑定(bind)重定向 在您的终端处理这个问题。轻轻触及 this article关于 Nuget 版本控制。这可以用 Add-BindingRedirect 来完成电源外壳命令。 This article展示了如何自动运行它。

关于dll - 为什么我的 NuGet 包只能与特定版本的第三方库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22842482/

相关文章:

java - 库开发中如何正确使用Java访问修饰符

c# - NuGet 直接项目引用作为版本依赖项

c - 为什么调用 dll 函数会改变我在 C 中的变量?

windows - 动态加载 Windows dll 时,如何知道缺少的相关模块的名称

Android Google Map 和 firebase 依赖问题

WPF 附加属性在 xaml 中设置时不会触发代码

.net - OpenWrap 与 NuGet

c# - 从私有(private) nuget 提要下载所有包

C#调用C++单例基于类的dll

c# - 从 Dll 导出接口(interface)。 C# Delphi VB C++ 等