.NET:关于AssemblyVersion,什么定义了二进制兼容性?

时间:2009-04-20 15:40:23

标签: c# .net clr gac

对强名称程序集进行哪些更改需要更改AssemblyVersionAttribute?显然,以可能需要客户端进行代码更改的方式更改公共API需要增加AssemblyVersion。但是,对于不需要在客户端中进行代码更改的公共API的更改呢?例如:

  • 添加公共类或接口?
  • 将公共成员添加到公共类或接口? (编辑:drscroogemcduck正确地指出,在界面中添加一个成员会阻塞所有实现者。傻我。)
  • 提高班级成员的知名度?

必须在MSDN上的某个地方有明确的文档(或者,在某些MSSE的个人博客上了解MS)。但我根本找不到它。请帮忙!

4 个答案:

答案 0 :(得分:5)

回应Martijn的赏金:

关于二进制兼容性的最佳参考是在社区Wiki上。

A definite guide to API-breaking changes in .NET

答案 1 :(得分:4)

这很简单......只要类型保持不变(在公共或受保护的布局中)并且方法签名没有改变(添加方法或类型很好),JIT应该能够很好地链接DLL。

那就是说,我认为即使它 工作,你也不应该这样做。如果需要,创建一个新版本并使用策略将旧版本映射到新版本。否则你会直接回到DLL地狱......而且我很确定你不想那样。

答案 2 :(得分:1)

向接口添加方法应该没有问题,因为旧的提供程序不会实现新方法。

答案 3 :(得分:1)

Microsoft在Service Pack版本的.NET库中添加新方法/类,而不更改AssemblyVersion(仍为2.0.0.0 / 3.0.0.0)。 Microsoft仅更改AssemblyFileVersion。 例如,在.NET 2.0 SP1中,添加了DateTimeOffset结构。

是否应该向我们推荐这种做法,因为Microsoft会这样做? 这很令人困惑。