はじめに
.NET Frameworkはビルド時のバージョンと実行時のバージョンが異なっても
app.exe.configに以下の追記をすれば動作できるようになっています。
<startup useLegacyV2RuntimeActivationPolicy="true|false" >
<supportedRuntime version="runtime version" sku="sku id"/>
</startup>
※互換性の問題は当然アプリ側で考慮(検証)が必要です。
versionやskuに設定できる値等は公式ドキュメントをみていただくとして、
v4.0のときのskuの設定値について備忘録のために記載します。
なぜv4.0なのか
前提として.NET Framework4.5以上はインプレース更新となるため、
4.5以降は同居できないものと想定しています。
.NET Framework 4.5 はコンピューターの .NET Framework 4 を置き換えるインプレース更新であり、.NET Framework 4.5.1、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1、4.7.2 は .NET Framework 4.5 のインプレース更新です。つまり、同じバージョンのランタイム バージョンを使用しますが、アセンブリのバージョンが更新され、新しい型とメンバーが含まれます。
同居ができないのにsku属性はなぜ必要なのかと思ったのがきっかけです。
(結局常に最新をみるのでは?)
結論
versionがv4.0の場合のskuは最低バージョンとなるようです。
例えば、sku=".NETFramework,Version=v4.7.2"と記載すると、
4.6.2までしか入っていないと起動時にメッセージが表示されます。
<startup useLegacyV2RuntimeActivationPolicy="true" >
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
自端末には既に4.7.2がインストールされていたので、
適当に4.8とかに記載してみたところ以下のようなメッセージが表示されました。
ちなみに「はい(Y)」を選択するとMSのサイトに飛ばされます。
(4.8だと4.7.2のインストールサイトに飛ばされました)
hoge.exe - This application could not be started.
This application requires one of the following versions of the .NET Framework:
.NETFramework,Version=v4.8Do you want to install this .NET Framework version now?
はい(Y) いいえ(N)
バージョン指定できるので、
一瞬過去バージョンでも動作できるのかと迷ってしまいましたが、
インプレース更新ということを思い出して納得しました。