1. ホーム
  2. c#

[解決済み] XPで.NET 4.5アプリを動かすことは可能ですか?

2023-05-07 20:25:37

質問

まず、以下を読ませていただきました。

しかし、私のチームは .NET 4.0 から .NET 4.5 にアップグレードしたいと考えているので、明確な答えが得られるかどうかを確認する必要がありました。しかし、私たちは XP をサポートしなければなりません。


XP をサポートしたい場合、.NET 4.5 に移行する可能性はないのでしょうか。

唯一考えられるのは、2 つの別々のソリューションを作成することですが、.NET 4.5 の機能を使用する場合、コードベースを分岐させる必要があります。

そこで、私は、私が見つけられず、他の人がすでに知っているかもしれない、何か驚くべき回避策を探しています。

どのように解決するのですか?

この回答を投稿するのはためらわれます。実際に技術的には可能ですが、実際にはそれほどうまくいきません。 CLR とコア フレームワーク アセンブリのバージョン番号は 4.5 で変更されていません。 ildasm.exeのようなディスアセンブラでアセンブリマニフェストを見たときに唯一特徴的なのは、4.5が必要であるという[TargetFramework]属性の存在で、これを変更する必要があるのです。 実際には、コンパイラーによって生成されるので、それほど簡単ではありません。

最大の違いは目に見えるものではありません。Microsoft は、アセンブリの実行可能ヘッダーに長年の変更を加えました。 これは、実行ファイルがどの Windows のバージョンと互換性があるかを指定するものです。 XP は、Windows 2000 で始まった Windows の前世代に属します。 そのメジャー バージョン番号は 5 で、Vista は現在の世代のスタートであり、メジャー バージョン番号は 6 です。

.NET コンパイラーは常に最小バージョン番号を Windows NT と Windows 9x のバージョンである 4.00 に指定しています。 これは、アセンブリ上で dumpbin.exe /headers を実行することにより確認することができます。 サンプル出力はこのようになります。

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

.NET 4.5で新しいのは、コンパイラーがサブシステムのバージョンを6.00に変更したことです。 Windows がこの数字に注意を払い、それが十分に小さいかどうかをチェックするだけではないため、大部分は遅れていた変更です。 また、プログラムが古いバージョンのWindowsで動作するように書かれていると仮定して、appcompatの機能をオンにします。 特に、Aeroでウィンドウの大きさを偽って表示するのは厄介なことです。 プログラムが Aero を搭載した Windows のバージョンで実行するように設計されていることがわかると、Aero ウィンドウの太い境界線について嘘をつくのを止めます。

アセンブリ上で Editbin.exe を /subsystem オプション付きで実行することにより、そのバージョン番号を変更し、4.00 に戻すことができます。 この回答 は、ポストビルドイベントのサンプルを示しています。

しかし、良いニュースはこれで終わりです。重要な問題は、.NET 4.5 が .NET 4.0 とあまり互換性がないことです。 最も大きな障害は、クラスが 1 つのアセンブリから別のアセンブリに移動されたことです。 最も顕著なのは、[Extension]属性について起こったことです。 以前はSystem.Core.dllにありましたが、.NET 4.5ではMscorlib.dllに移動されました。 これは、独自の拡張メソッドを宣言した場合、プログラムがMscorlibで属性を探すように指示します。.NET 4.5バージョンのSystem.Core参照アセンブリでは、[TypeForwardedTo]属性が有効になっています。 しかし、.NET 4.0 でプログラムを実行すると、それは存在しません。

そしてもちろん、.NET 4.5 でのみ利用可能なクラスとメソッドの使用を中止するのに役立つものは何もありません。 そうすると、4.0 で実行したときに、プログラムは TypeLoadException または MissingMethodException で失敗します。

4.0 をターゲットにするだけで、これらの問題はすべてなくなります。 これは、プログラマーにはあまりできないことですが、XP が引き起こしている面倒を指摘することによって、確実に促進することができるビジネス上の決定です。 もちろん、古いOSをサポートしなければならないコストはゼロではありませんし、テストの労力も相当なものです。 Windowsの互換性は伝説的なものであり、そのことを指摘されない限り、経営陣はそのコストをあまり認識していません。 Windowsの互換性は、指摘されない限りは伝説的な存在です。) しかし、私たちはそのお手伝いをすることができません。