gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:52:00 26 4
gpt4 key购买 nike

我有一个使用 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)。但是,第二个确实有。

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

最佳答案

.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 代码并添加公共(public)类和方法,而不会造成这种破坏。自最初的 4.0 版本以来,已经发布了 4.01、4.02 和 4.03 更新。

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

关于.net - 引用程序集文件夹和具有相同版本的不同程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51400507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com