为什么安装了.NET 4的计算机无法运行针对.NET 4.5的exe,而如果它们使用相同的CLR版本?

时间:2014-03-12 12:37:57

标签: .net runtime clr .net-assembly clr4.0

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?)

2 个答案:

答案 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版本。   看图像,   Build by v 3.5   由v 3.5构建   和   Build by 4.0   建立4.0。