C# 如何使用nugets避免MissingMethodException?

C# 如何使用nugets避免MissingMethodException?,c#,nuget,version,C#,Nuget,Version,我正在用我所有的C#项目创建NUGET,因此替换了对csproj文件的所有直接引用。所有nuget引用都是“最低版本,包括”,因此当库更新时,所有其他项目将自动恢复该nuget的最新版本。我遇到的问题是,我不知道如何确保nuget中的更改不会使编译在其他项目中失败。到目前为止,我通常在一个解决方案中构建所有项目,因此如果某个项目无法编译,我会立即知道。现在我正在使用nugets,我最终引入了新的bug,因为我无法确保代码仍然可以编译,或者更糟糕的是,如果代码能够运行,可能会崩溃 下面是一个例子:

我正在用我所有的C#项目创建NUGET,因此替换了对csproj文件的所有直接引用。所有nuget引用都是“最低版本,包括”,因此当库更新时,所有其他项目将自动恢复该nuget的最新版本。我遇到的问题是,我不知道如何确保nuget中的更改不会使编译在其他项目中失败。到目前为止,我通常在一个解决方案中构建所有项目,因此如果某个项目无法编译,我会立即知道。现在我正在使用nugets,我最终引入了新的bug,因为我无法确保代码仍然可以编译,或者更糟糕的是,如果代码能够运行,可能会崩溃

下面是一个例子:

  • 应用程序“App”指的是nuget库“LibA”
  • 项目“LibA”指nuget“LibB”
  • 在项目“LibB”中发布了一个修补程序,因此发布了新的nuget
  • 此修补程序使构建“LibA”变得不可能,因为意外地删除了一个方法。但是没有人试图建立“LibA”,所以没有人注意到它
  • 有人构建了“App”,编译工作正常,因为“App”没有直接引用“LibB”中缺少的方法。因此,只有在运行时,当“LibA”试图调用缺少的方法时,问题才会出现

我知道我可以使用更严格的版本管理来实现这一点,因此当nuget发生更改时,我需要更改所有引用,因此所有其他项目都需要新的版本来使用这个新版本的库。但是,如果这意味着我需要系统地修改数百个项目,只是为了在一个库中修复一个bug,那么这似乎并不方便。

那么您的需求会阻止您更改方法签名。方法实现总是可以更改的。但是,如果不破坏代码,就不能删除任何签名。现在,您最多可以将函数标记为“已弃用”。基本上,在.NET框架和以前的所有库中,情况都是一样的。问题是:如何实施它?是否可以创建一个策略来禁止删除公共方法的更改?另外,假设有人在代码中添加了破坏编译的东西(例如:另一个程序集中已经存在的方法扩展),如何防止这种情况,和/或如何确保我们在代码发布之前发现问题?据我所知,这导致了单元测试的整个概念,持续集成,甚至门控检查,我正在处理遗留代码。我预计在5年内,我可能会大量依赖单元测试,使单个库变得可靠。与此同时,我必须处理所有类似这样的问题。我几乎没有测试,所有的东西都是公开的,一个小小的改变可能会引入各种编译错误。我需要一个解决我的长期过渡。我甚至不想避免错误。我只是希望我至少能以低成本快速抓住他们。我负担不起每次更改时对所有NUGET的完整重建。我几乎可以肯定,从技术上来说,分析dll的内容以检查对所有外部方法/属性的引用是否仍然有效是可行的。我只是不知道怎么做。如果可能的话,我可以运行一个例程来验证我所有的DLL,这将花费实际重建项目所需时间的一小部分。然后,您的需求会阻止您更改方法签名。方法实现总是可以更改的。但是,如果不破坏代码,就不能删除任何签名。现在,您最多可以将函数标记为“已弃用”。基本上,在.NET框架和以前的所有库中,情况都是一样的。问题是:如何实施它?是否可以创建一个策略来禁止删除公共方法的更改?另外,假设有人在代码中添加了破坏编译的东西(例如:另一个程序集中已经存在的方法扩展),如何防止这种情况,和/或如何确保我们在代码发布之前发现问题?据我所知,这导致了单元测试的整个概念,持续集成,甚至门控检查,我正在处理遗留代码。我预计在5年内,我可能会大量依赖单元测试,使单个库变得可靠。与此同时,我必须处理所有类似这样的问题。我几乎没有测试,所有的东西都是公开的,一个小小的改变可能会引入各种编译错误。我需要一个解决我的长期过渡。我甚至不想避免错误。我只是希望我至少能以低成本快速抓住他们。我负担不起每次更改时对所有NUGET的完整重建。我几乎可以肯定,从技术上来说,分析dll的内容以检查对所有外部方法/属性的引用是否仍然有效是可行的。我只是不知道怎么做。如果可能的话,我可以运行一个例程来验证我所有的DLL,这将花费实际重建项目所需时间的一小部分。