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

时间:2012-03-14 11:32:42

标签: .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)。但是,第二个确实拥有它。

为什么该程序集的大小和类有很大差异?如果我使用第二个而不是第一个,那会没关系吗?

1 个答案:

答案 0 :(得分:50)

.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。