web-dev-qa-db-ja.com

XPで.NET 4.5アプリを実行することは可能ですか?

最初に、私は次を読みました。

だから、最後の弾丸から、私は本当にこれを回避する方法はないと思いますが、私のチームが.NET 4.0から.NET 4.5にアップグレードしたいので、決定的な答えを得ることができるかどうかを見なければなりませんでした。ただし、XPをサポートする必要があります。

XPをサポートしたい場合、.NET 4.5に行く可能性はありませんか?

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

だから、私は見つけることができなかったいくつかの驚くべき回避策を探しています。

84
Justin Pihony

この回答を投稿することをheします。実際には技術的には可能ですが、実際にはうまくいきません。 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(Windows NTおよびWindows 9xのバージョン)に指定しています。これを確認するには、アセンブリで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でのウィンドウのサイズに関するWindowsのあり方が面倒です。プログラムがAeroを搭載したWindowsバージョンで実行するように設計されていることがわかると、Aeroウィンドウの太い境界線の周りに横たわることがなくなります。

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

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

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

4.0のみをターゲットにすると、これらの問題はすべてなくなります。あるいは、その対抗策を破り、XPのサポートを停止します。XPは、プログラマが頻繁に行うことはできませんが、それが引き起こしている手間を指摘することで確実に奨励できるビジネス上の決定です。もちろん、古代のオペレーティングシステムをサポートするためにゼロ以外のコストがかかりますが、テストの労力はかなりのものです。経営陣に認識されないことの多いコストであるWindows互換性は、特に指摘しない限り伝説的です。その費用をクライアントに転送すると、彼らは正しい決定をはるかに迅速にする傾向があります:)しかし、私たちはあなたを助けることはできません。

183
Hans Passant

残念ながら、XPでは4.5プログラムを実行できません。

そして、そのConnectページからの関連する投稿:

マイクロソフトが2012年3月23日に10:39に投稿
レポートをありがとう。この動作は、.NET Framework 4.5 Betaの仕様によるものです。サポートされる最小オペレーティングシステムは、Windows 7、Windows Server 2008 SP2、およびWindows Server 2008 R2 SP1です。 Windows XPは、ベータリリースでサポートされているオペレーティングシステムではありません。

21
Oztaco

Monoプロジェクトは、Windows XPサポートと"forgot"を廃止しました。彼らはまだWindows XP SP2がサポートされる最小バージョンであると主張していますが、実際にはWindows Vistaです。

Windows XPをサポートするMonoの最後のバージョンは3.2.3でした。

7
guest

モノを試してください:

http://www.go-mono.com/mono-downloads/download.html

このダウンロードは、Windows XP、2003、Vista、およびWindows 7のすべてのバージョンで動作します。

7
luiseduardohd

Windowsをサポートする最後のバージョンXP(SP3)はmono-4.3.2.467-gtksharp-2.12.30.1-win32-0.msiであり、.NET 4.5に置き換わるものではありませんが、一部のアプリケーションでは興味深い場合があります。

参照: https://download.mono-project.com/archive/4.3.2/windows-installer/

4
Sandy