私はこの答えを投稿することを躊躇します、それは実際には技術的に可能ですが、実際にはそれほどうまく機能しません。CLRとコアフレームワークアセンブリのバージョン番号は4.5では変更されていません。CLRのv4.0.30319を引き続きターゲットにし、フレームワークアセンブリのバージョン番号は4.0.0.0のままです。ildasm.exeのような逆アセンブラでアセンブリマニフェストを見るときに特徴的なのは、4.5が必要であるという[TargetFramework]属性の存在だけです。これは変更する必要があります。実際にはそれほど簡単ではありませんが、コンパイラーによって発行されます。
最大の違いはそれほど目に見えないことです。Microsoftは、アセンブリの実行可能ヘッダーに長い間延期されていた変更を加えました。これは、実行可能ファイルが互換性のあるWindowsのバージョンを指定します。XPは、Windows 2000以降の前世代のWindowsに属しています。メジャーバージョン番号は5です。Vistaは、現在の世代のメジャーバージョン番号6の始まりでした。
.NETコンパイラは、最小バージョン番号を常に4.00、つまりWindowsNTおよびWindows9xのバージョンとして指定しています。これは、アセンブリでdumpbin.exe / headersを実行することで確認できます。サンプル出力は次のようになります。
OPTIONAL HEADER VALUES
10B magic # (PE32)
...
4.00 operating system version
0.00 image version
4.00 subsystem version
0 Win32 version
...
.NET 4.5の新機能は、コンパイラがそのサブシステムのバージョンを6.00に変更することです。Windowsがその数に注意を払うために、それが十分に小さいかどうかをチェックするだけでなく、大部分が遅れていた変更。また、プログラムが古いバージョンのWindowsで動作するように作成されていることを前提としているため、appcompat機能もオンになります。これらの機能は問題を引き起こします。特に、Aeroのウィンドウのサイズに関するWindowsの位置付けは厄介です。プログラムがAeroを搭載したWindowsバージョンで実行するように設計されていることがわかると、Aeroウィンドウの太い境界線の周りに横たわるのをやめます。
/ subsystemオプションを指定してアセンブリでEditbin.exeを実行することにより、そのバージョン番号を変更して4.00に戻すことができます。 この回答は、ビルド後のイベントのサンプルを示しています。
ただし、これで朗報は終わりです。重要な問題は、.NET4.5が.NET4.0とあまり互換性がないことです。最大の問題は、クラスが1つのアセンブリから別のアセンブリに移動されたことです。最も注目すべきは、[Extension]属性で発生したことです。以前はSystem.Core.dllで、.NET4.5のMscorlib.dllに移動されました。独自の拡張メソッドを宣言する場合、これはXPの問題です。プログラムは、System.Core参照アセンブリの.NET4.5バージョンの[TypeForwardedTo]属性によって有効になっている属性をMscorlibで検索するように指示します。しかし、.NET4.0でプログラムを実行するとそこにはありません
そしてもちろん、.NET4.5でのみ利用可能なクラスとメソッドの使用をやめるのに役立つものは何もありません。これを行うと、4.0で実行すると、プログラムがTypeLoadExceptionまたはMissingMethodExceptionで失敗します。
4.0をターゲットにするだけで、これらの問題はすべて解消されます。または、そのログジャムを破り、XPのサポートを停止します。これは、プログラマーが頻繁に行うことはできないが、それが引き起こしている煩わしさを指摘することで確実に奨励できるビジネス上の決定です。もちろん、古代のオペレーティングシステムをサポートしなければならないことにはゼロ以外のコストがかかり、テストの努力だけがかなりのものになります。管理者があまり認識しないコストであるWindowsの互換性は、指摘されない限り伝説的です。その費用をクライアントに転送すると、クライアントは正しい決定をはるかに迅速に行う傾向があります:)しかし、私たちはそれを支援することはできません。