Reference Assemblies文件夹和具有相同版本的不同程序集

Ser*_*nov 25 .net .net-assembly

我有一个使用System.Runtime.Serialization程序集的项目.我正在使用该DataContractSerializer程序集中的类型,但我遇到了问题.有两个组件:

C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Runtime.Serialization.dll

C:\ WINDOWS\Microsoft.net \框架\ v4.0.30319\System.Runtime.Serialization.dll

它们都有相同的版本 - v4.0.30319.第一个有429kb大小,第二个有1037kb.我用反射器来查看类列表,第一个没有我需要的类(DataContractSerializerSettings).但是,第二个确实拥有它.

为什么该组件的大小和类有一些很大的不同?如果我使用第二个而不是第一个,那会没关系吗?

Han*_*ant 52

.NET 4.0版在框架引用程序集的完成方式上做了很大的改变.以前,引用程序集是运行时程序集的简单副本,存储在GAC中.然而,这引起了一些痛苦的问题.值得注意的是WaitHandle.WaitOne(int)重载,它是在.NET 2.0 Service Pack 2更新(又名.NET 3.5)中添加的.程序员使用它而没有注意到它是一个添加的方法,mscorlib程序集版本号仍然是2.0.0.0.但后来发现他们的程序在未修补的.NET 2.0版本上运行时失败了.非常讨厌的kaboom,MissingMethodException没有提示为什么这样的常见方法可能会丢失.

为了防止这种破坏,.NET 4.0引用程序集在您发现的"%programfiles%\ Reference Assemblies"目录中保持独立.它们是特殊的程序集,它们只包含所有IL剥离的元数据.这就是为什么装配体要小得多的原因.

Microsoft现在可以改进.NET 4代码并添加公共类和方法,而不会导致这种破坏.自从最初的4.0版本发布以来,已经发布了4.01,4.02和4.03更新.

DataContractSerializerSetting因此很容易解释您遇到类的问题,它只是没有出现在参考组件中.它被添加,可能是其中一个增量更新.你不应该尝试,你的程序将在没有更新的机器上中断.您应该等到.NET 4.5,将其添加到引用程序集的版本.如果你真的想要,你可以调用DLL Hell.

  • 永远不要假设任何事情,总是问"为什么",继续挖掘直到你发现.保持这种状态30年. (13认同)
  • 只要您考虑使用测试版的dbase引擎,那么您也可以全力以赴并使用测试版的.NET 4.5.希望您的客户也愿意参与. (4认同)
  • @HansPassant你怎么知道这么多,尤其是 所有这些?我怀疑,这种信息必须告知一个非常精英的群体.我如何了解这类东西?我如何成为一名优秀的程序员? (2认同)