.net 引用程序集文件夹和具有相同版本的不同程序集

.net 引用程序集文件夹和具有相同版本的不同程序集,.net,.net-assembly,.net,.net Assembly,我有一个使用System.Runtime.Serializationassembly的项目。我正在使用该程序集中的类型DataContractSerializer,但我有一个问题。 有两个组件: C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETFramework\v4.0\System.Runtime.Serialization.dll C:\Windows\Microsoft.net\Framework\v4.0.

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

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

C:\Windows\Microsoft.net\Framework\v4.0.30319\System.Runtime.Serialization.dll

它们都有相同的版本——v4.0.30319。第一个大小为429kb,第二个大小为1037kb。我使用reflector查看类列表,第一个类没有我需要的类(
DataContractSerializerSettings
)。然而,第二个确实有


为什么该组件在大小和类别上存在较大差异?如果我使用第二个,而不是第一个,可以吗?

.NET 4.0版对框架引用程序集的执行方式进行了重大更改。以前,引用程序集是存储在GAC中的运行时程序集的简单副本。然而,这造成了一些痛苦的问题。值得注意的是
WaitHandle.WaitOne(int)
重载,它是在.NET2.0ServicePack2更新(又名.NET3.5)中添加的。程序员使用它时没有注意到它是一个添加的方法,mscorlib程序集版本号仍然是2.0.0.0。但后来发现他们的程序在未修补的.NET2.0版本上运行时失败。非常讨厌的kaboom,MissingMethodException,没有提示为什么会缺少这样一个常用方法

为了防止这种破坏,您发现,.NET 4.0引用程序集在“%programfiles%\reference Assemblys”目录中保持独立。而且它们是特殊的程序集,它们只包含所有IL剥离后的元数据。这就是为什么总成要小得多

微软现在可以改进.NET4代码并添加公共类和方法,而不会造成这种破坏。而且,自从最初的4.0版本发布以来,4.01、4.02和4.03的更新已经大量发布


因此,您在
DataContractSerializerSetting
类中遇到问题的原因很容易解释,它只是没有出现在引用程序集中。它被添加了,可能是在其中一个增量更新中。你不应该尝试,你的程序会在没有更新的机器上崩溃。您应该等到.NET 4.5,即将其添加到引用程序集的版本。如果你真的愿意,你可以调用DLL地狱。

谢谢@Hans,你的答案非常有用。然而,现在我担心的是这个问题和给我的答案。你能就如何在客户端PC上获得这个临时版本4.0.2等给出你的意见吗?只要你考虑使用一个DBASE引擎的beta版本,那么你不妨去完整的HOG,也可以使用.NET 4.5的beta版本。希望你的客户也愿意参与。@HansPassant你怎么知道这么多,尤其是所有这些?我怀疑这类信息一定是一个非常精英的群体所掌握的。我怎么知道这类事情?我怎样才能成为像你一样优秀的程序员?永远不要假设任何事情,总是问“为什么”,继续挖掘直到你发现。保持30年,那么真正的装配在哪里呢?