【问题标题】:Why a machine with .NET 4 installed on it cannot run an exe that targeted .NET 4.5 while if they use the same CLR version?为什么安装了 .NET 4 的机器在使用相同的 CLR 版本时无法运行针对 .NET 4.5 的 exe?
【发布时间】:2014-04-16 14:29:38
【问题描述】:

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.1 为目标的可执行文件将被阻止在仅安装了 .NET Framework 4.5 的计算机上运行,​​并且将提示用户安装 .NET Framework 4.5。 1.此外,不应从 .NET Framework 4.5 应用调用 .NET Framework 4.5.1 程序集。'

问题:如果所有 Net Framework 版本 4 和 4.5 和 4.5.1 在相同的 CLR 版本 4 上运行托管代码,为什么我无法运行可执行文件在仅安装了 .Net 4.0 的机器上以 .Net framework 4.5 为目标?

(不管您的目标是 .NET framework 4 或 4.5 还是 4.5.1,编译器最终不会生成适用于 CLR 版本 4 的 IL 吗?)

【问题讨论】:

  • 重要的东西。很高兴知道。

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


【解决方案1】:

是的,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] 属性以尽可能早地尝试运行程序失败。

【讨论】:

  • 所以,基本上这是因为 FCL 中的特定类型被移动到不同的程序集中。这意味着如果我以 .NET 4.5 为目标并创建一个控制台应用程序。并尝试在安装了 .NET 4.0 的平台上运行它,根据已编译 IL 的元数据,CLR 将查看引用的程序集以使用这些特定类型,而它们将在其他一些程序集中。我猜对了吗?
  • 大概。 .NET 4.0 足够聪明地告诉您需要安装 4.5 并要求您为您安装。 This answer 向您展示了它的样子。
  • 于是,随着涟漪、波浪和膨胀,我们不可避免地回到了dll地狱。
【解决方案2】:

微软,

每个程序集,无论是静态的还是动态的,都包含一个集合 描述组件中的元素如何与每个元素相关的数据 其他。程序集清单包含此程序集元数据。 Assembly Manifest. 此清单包含有关该可执行文件的构建 CLR 的信息,并且在执行 exe/dll .net CLR 时会尝试找出相同的 CLR 版本。 看图, 由 v 3.5 构建 和 按 4.0 构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2022-12-24
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多