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

.NET: with respect to AssemblyVersion, what defines binary compatibility?

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

  • 添加公共类或接口?
  • 向公共类或接口添加公共成员?(编辑:drscrooggemcduck在下面正确地指出,将成员添加到接口将影响所有实现者。愚蠢的我。
  • 提高了类成员的可见性?

在msdn的某个地方(或者,了解ms,在msse的个人博客上)必须有这方面的最终文档。但我根本找不到它。请帮助!


为了回应马提金的赏金:

关于二进制兼容性的最佳参考是Communitywiki。

.NET中API中断更改的明确指南


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

也就是说,我认为即使它起作用,你也不应该这样做。制作新版本,如果需要,使用策略将旧版本映射到新版本。否则你就直接开车回DLL地狱…我很肯定你不想那样。


Microsoft在Service Pack版本的.NET库中添加新方法/类,而不更改assemblyversion(仍为2.0.0.0/3.0.0.0.0)。Microsoft只更改assemblyfileversion。例如,在.NET 2.0 SP1中,添加了datetimeoffset结构。

是否应该向我们推荐这种做法,因为Microsoft会这样做?这很混乱。


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