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


86

まず、私は以下を読みました:

したがって、前回の箇条書きから、これを回避する方法は本当にないと思いますが、チームが.NET4.0から.NET4.5にアップグレードしたいので、決定的な答えが得られるかどうかを確認する必要がありました。ただし、XPをサポートする必要があります。

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

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

だから、私は見つけることができなかったいくつかの素晴らしい回避策を探しています、そして他の人はおそらくすでに知っています。


9
いいえ、できません。XPが確実に死ぬまで4.0に固執します。
Federico Berasategui 2013

回答:


188

私はこの答えを投稿することを躊躇します、それは実際には技術的に可能ですが、実際にはそれほどうまく機能しません。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              // <=== here!!
               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の互換性は、指摘されない限り伝説的です。その費用をクライアントに転送すると、クライアントは正しい決定をはるかに迅速に行う傾向があります:)しかし、私たちはそれを支援することはできません。


2
ハンスに感謝します、私はいくつかの重大な変更があったと思いました。回避策にも感謝します。ご指定の理由によりご利用いただけませんが、ご承知おきください。たぶん、XPは....良いいつかのために離れて行く
ジャスティンPihony

3
just the testing effort is substantial-それが、私たちの管理が「XPサポートの削除を許可する」ようになった理由です。
クリストフフィンク2014年

私はこれが古い投稿であることを知っています-しかし-@ JustinPihony:あなたの会社は後のOSをインストールしてからVMWareまたはVirtualBoxをインストールすることを考えたことがありますか?Windows 7には少し遅れていますが、Microsoftは、7とXPを切り替えることができる仮想WindowsXPインストールを提供しました。ちょっとした考え。:-)
マークマニング

@MarkManningそれは私たちのコントロールではありませんでした。他の場所で使用されていました。
Justin Pihony 2016

1
@JustinPihony:ああ。うーん……私の他の唯一の提案はクルーゲです。OSのバージョンをキャプチャしてから、クラス内のすべての関数を配列(または配列)に配置するように設定します。1つのアレイ(またはアレイの一部)をXP用にし、もう1つを新しいOS用にします。次に必要なのは、使用するセットを示すために使用されるある種のグローバル変数です。呼び出しはすべて同じ(または同じように見える)である可能性がありますが、1つのセットはNET40_ <FUNCTION>を使用し、他のセットはNET45_ <FUNCTION>を使用できます。これは、関数自体への間接的な呼び出しになります。それは理にかなっていますか?
マークマニング

21

残念ながら、いいえ、XPで4.5プログラムを実行することはできません。

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

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


8

Monoプロジェクトは、Windows XPのサポートを終了し、言及するのを「忘れました」。彼らはまだWindowsXP SP2がサポートされている最小バージョンであると主張していますが、実際にはWindowsVistaです。

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


7

モノを試す:

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

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


2
Monoは.NETよりも低速であり、.NET 4.5のほとんどの機能を備えていますが、WPF(mono-project.com/Compatibility)などの特定の主要コンポーネントが不足しています。したがって、Mono for XPのサポートが必要なものをすべて提供し、パフォーマンスへの影響に問題がなければ、Mono forXPのサポートを使用できます。プラス面として、特別な「Monoビルド」を作成する必要はありません。通常の.NET 4.5ビルドは通常Monoで動作しますが、互換性があることを確認するために、Monoに対してテストする必要があります。
qwertie 2014年

2
Windows XP SP3でmono-3.12.1-gtksharp-2.12.26-win32-0.msiを試しましたが、「mono.exeは有効なWin32アプリケーションではありません」で失敗しました。また、mono-3.0.10-gtksharp-2.12.11-win32-0.exeを試しましたが、「mono.exe-エントリポイントが見つかりません。プロシージャエントリポイントInterlockedCompareExchange64がダイナミックリンクライブラリKERNEL32に見つかりませんでした。 .dll "
Cristian Ciupitu 2015

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.