在Common Language Runtime (CLR) Microsoft页面中,它表示.Net Framework 4和4.5都使用CLR版本4.
然而,在这个页面(.NET Framework Versions and Dependencies)中,它写了'.Net Framework 4.5版包含了CLR 4的更新版''
还写道:
'将阻止在仅安装了.NET Framework 4.5的计算机上运行以.NET Framework 4.5.1为目标的可执行文件,并提示用户安装.NET Framework 4.5。 1。此外,不应从.NET Framework 4.5应用程序调用.NET Framework 4.5.1程序集。'
问题:如果所有Net Framework版本4和4.5和4.5.1在同一个4的CLR版本上运行托管代码,为什么我无法运行可执行文件在仅安装了.Net 4.0的机器上以.Net framework 4.5为目标?
(不管你是否针对.NET framework 4或4.5或4.5.1,编译器最终是否会产生适用于CLR版本4的IL?)
答案 0 :(得分:16)
是的,CLR版本是相同的,仍然是v4.0.30319。 .NET Framework类库是一种高度向后发展的方式。通过将对WinRT(应用商店应用)的支持集成到框架中而实现的更改。有几种类型从一个程序集移动到另一个程序集,最明显的是ExtensionAttribute和ICommand。在移动设备上对小型.NET实现的需求是有帮助的。 System.Core和PresentationFramework都不小。
这相当重要,声明类型的程序集是.NET类型的类型标识的一部分。或者换句话说,具有相同命名空间名称和类型名称的.NET类型永远不会与来自另一个程序集的具有相同全名的类型兼容。
这完全可能是因为.NET 4.0中的创新。从[TypeForwardedTo]属性开始,该属性是用于移动类型的属性。以及c:\ program files \ reference程序集中的特制参考程序集。特别之处在于它们只包含元数据,并且与您的程序将在运行时使用的GAC中安装的实际程序集不直接匹配。
这有时会以非常难以诊断的方式出错,这是通过使用错误的参考组件引起的。不幸的是,微软将传统的参考组件保存在c:\ windows \ microsoft.net \ framework中。使用它们的项目以相当悲惨的方式失败。
因此,这是无法工作的,针对.NET 4.5的程序将在错误的4.0 GAC程序集中查找ExtensionAttribute和ICommand等类型。并且完全不可识别的TypeLoadException失败了。因此,首先检查[TargetFramework]属性,以尽早尝试运行程序。
答案 1 :(得分:1)
微软,
每个装配,无论是静态的还是动态的,都包含一个集合 描述程序集中元素如何与每个元素相关的数据 其他。程序集清单包含此程序集元数据。 Assembly Manifest. 此清单包含有关该可执行文件的构建CLR的信息,并且在执行exe / dll .net时,CLR尝试查找相同的CLR版本。 看图像, 由v 3.5构建 和 建立4.0。