当我们编译程序目标框架选为 .Net Framework 4.5/4.6/4.7 时,CLR 运行时是如何判断我们究竟应该用哪一个 .Net Framework 呢?.Net Framework 的版本到底由哪些部分组成?我们编译 .Net Framework 时选择的版本到底决定了什么?
让我对这个问题产生兴趣的原因是:
- 我将程序编译的目标框架选为 .Net Framework 4.7;在一台安装了 .Net Framework 4.6 的电脑上提示缺少 .Net Framework 4.7;删除了随编译一起生成的 app.config
文件后程序能够正常运行。
- 另一个程序,我明明将程序编译的目标框架选为 .Net Framework 4.5,但在一台没有安装任何额外 .Net Framework 的 Windows 7 的电脑上提示缺少的是 .Net Framework 4.0。
这里的疑点在于为什么以上两种看似类似的情况,提示的框架版本却不同。其中的 app.config
文件成为了调查此问题的突破口。
配置支持的运行时
观察程序附带的 app.config
文件,我们发现支持的运行时版本是 v4.0,sku 版本是 4.7。
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
</startup>
</configuration>
疑点:
1. 为什么我们基于 .Net Framework 4.7 开发的程序运行时版本是 4.0?
1. sku 是什么?
微软的官方文档给了我们解答: