Hans Passantはすべてにおいて正しいが、この大失敗におけるPEヘッダーの役割である重要なポイントを見逃していると彼は言う。
Dotnet4.5はDotnet4.0の上にインプレースインストールされ、Dotnetバージョン番号を更新しないため、Dotnet 4.5を使用して構築されたバイナリでは、バイナリのPEヘッダーに古いDotnet 4.0バージョン番号が含まれます( 4.0.30319)。
CLRはPEヘッダーでこの値を使用してロードするDotnetFrameworkのバージョンを決定し、この値はDotnet 4.5に対して構築されたアセンブリでは変更されないため、追加情報がない場合、CLRには次の方法がありません。 PEヘッダーに4.0.30319が含まれるアセンブリで、Dotnet4.0または4.5へのリンクが必要かどうかを確認します。
この追加情報をCLRに提供するのは、app.configにsupportedRuntime要素が含まれていることです。したがって、Dotnet4.0のみがインストールされているシステムにsupportedRuntimeエントリが存在するDotnet4.5アプリケーションを起動すると、CLRは、必要なバージョンのDotnetがインストールされていないことを通知する有用なメッセージをポップアップ表示します。一方、Dotnet4.0のみがインストールされているシステムでsupportedRuntimeエントリなしで同じDotnet4.5アプリケーションを起動すると、アプリケーションの実行が開始される場合がありますが、後でDotnet4.5機能を使用しようとするとクラッシュします。
VS2012 RCを使用して構築され、Dotnet 4.5を対象とするプロジェクトでは、supportedRuntimeエントリが欠落している可能性がありますが、VS2012RTMを使用して構築されたプロジェクトにはエントリがあります。