[解決済み] XPで.NET 4.5アプリを動かすことは可能ですか?
質問
まず、以下を読ませていただきました。
- 接続ケース
- VSケース
- で、特に このチャンネル9の投稿
しかし、私のチームは .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の互換性は、指摘されない限りは伝説的な存在です。) しかし、私たちはそのお手伝いをすることができません。
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] .NETでC#オブジェクトをJSON文字列に変換するには?
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] .NETアプリケーションを強制的に管理者として実行させるにはどうしたらいいですか?
-
[解決済み] .NET 4.5で2つの非同期タスクを並列に実行し、結果を収集する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 2つのリストを結合する
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である