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

Posted

技术标签:

【中文标题】参考 Assemblies 文件夹和具有相同版本的不同程序集【英文标题】:Reference Assemblies folder and different assemblies with the same version 【发布时间】:2012-03-30 20:43:16 【问题描述】:

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

C:\Program Files (x86)\Reference Assemblies\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。我使用反射器查看类列表,第一个没有我需要的类(DataContractSerializerSettings)。但是,第二个确实有。

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

【问题讨论】:

【参考方案1】:

.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 的元数据。这就是为什么组件要小得多的原因。

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

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

【讨论】:

谢谢@Hans,你的回答很有用。但是现在我很担心这个question 和给我的答案。您能否就如何在客户端 PC 上获得此临时版本 4.0.2 等发表您的意见? 只要您考虑使用 dbase 引擎的 beta 版本,那么您不妨全心全意地使用 .NET 4.5 的 beta 版本。希望您的客户也愿意参与。 @HansPassant 你怎么知道这么多,尤其是。所有这些?我怀疑,这种信息一定是一个非常精英的群体知道的。我怎样才能知道这种东西?我如何成为像你一样优秀的程序员? 永远不要假设任何事情,总是问“为什么”,继续挖掘直到你发现。保持这种状态 30 年。 那么真正的程序集在哪里?

以上是关于参考 Assemblies 文件夹和具有相同版本的不同程序集的主要内容,如果未能解决你的问题,请参考以下文章

是否可以有多个触发器具有相同的触发事件和动作时间(之前/之后)

同时上传具有相同代码库但签名不同的两个版本的 apk

Web.Config 中的 Assemblies 节点的用途是啥?

如何将多个sql脚本执行到具有相同版本的flyway中

是否可以添加检查所有子模块是否具有与父 pom 中定义的相同版本?

Visual Studio 2015/2013安装失败:Microsoft Visual Studio 2015 Shell (Minimum) Interop Assemblies 安装时发生严重错