8

.NETの「AnyCPU」機能がどのように機能するかはわかっています。システムが32ビットの場合はビット、システムが64ビットの場合は64ビット(タスクマネージャで簡単に確認できます)。明らかに、これは不可能ではありません。Windows用のクロスプラットフォーム(32ビットおよび64ビット互換)プログラムの作成(.NETのAnyCPUなど)

質問は、マイクロソフトがこれをどのように正確に行ったのですか? Windowsはもともと.NETフレームワークについて知らなかったので、Windows PEローダーはおそらくCLRヘッダーのPEヘッダーの余分な機能を探すことはできません。この機能はある種のカーネルモード拡張によって追加されていなければなりません。しかし、.NETフレームワークはそのようなことをインストールしていないようです...私は、同じ実行可能ファイルがネイティブ32ビットと64ビットの同時実行可能性を完全に失っています。特に、mscoree.dllの逆アセンブリ文書化されていないネイティブ関数への参照を表示することさえありません。

これがどのように行われたかについて誰でも知識や妥当な推測がありますか?以下のよう

:それは(「それは不可能です」のようなので、何も言う事)明らかに可能ませんし、それは私がネイティブクロスプラットフォームのEXEを書き込もうとしたくなる...


編集32ビットの実行可能ファイルを64ビットのWindows PE環境で実行する方法を検討してください... がある場合、PEローダーを「プラグイン」のようなもので拡張または変更する方法があります?

+0

可能であれば、* 64ビットイメージを起動する* 32ビットの実行可能ファイルを配布するいくつかのプログラム(プロセス探査など)があります。例えば。 「AnyCPU」実行可能ファイルは、32ビットPE以外の何ものでもありません。 –

+0

@pst:私はそれらを完全に認識していますが、違っています。 AnyCPUの実行ファイルは、64ビットOSを起動してから64ビットです。アンパックはありません。「このバイトコードを64ビットにJITしてから、64ビットプロセスを再起動してみましょう。それが私を困惑させてしまいます。 – Mehrdad

答えて

5

あなたの質問は誤解に基づいています。ここでは間違いです:

Windowsは、もともとのWindows XP、Windows IS aware of the .NET executable formatいるので、実際には.NETフレームワークについて

を知りませんでした。 XPは64ビットをサポートするWindowsの最初のバージョンでした。

PEヘッダーは32ビットとマークされ、ネイティブインポートテーブルは32ビットmscoreeを参照します.Windows 2000以前では、32ビット.NETがロードされます。 DllMainmscoreeは、アプリケーションコードのJITtingを開始し、メインアプリケーションのエントリポイントを変更します。

Windows XP以降では、.NETメタデータを認識しており、AnyCPUであることが認識され、適切なフレームワークが読み込まれます。

Here's probably more than you ever wanted to know about the process

いいえ、ネイティブはありませんAnyCPU exe。 32ビットPEに16ビットのDOSプログラムを埋め込むことはできますが、32ビットと64ビットの両方の.exeを組み合わせることはできません。

+0

.NET Frameworkが* XPのリリース後に出てこなかった(少なくとも、私が思い出したと思うことです)? 私は[XPは2001年にリリースされた](http://en.wikipedia.org/wiki/Windows_xp)と[2002年の.NET](http://en.wikipedia.org/wiki/.NET_Framework)と考えました。 – Mehrdad

+0

@Lambert:開発期間が重複していたため、.NET開発は2002年の最初のリリースの5年前と同様に開始されたので、MicrosoftはXPにフックを入れる時間が十分にあります。そして私が言ったように、Windows 2000はわずか32ビットです。とにかく、この「魔法」を必要としたのは最初のバージョンなので、数年後のWindows XP 64ビット版のリリース日です。 –

+0

ああ...それはそれを説明します。 (そして、ええ、申し訳ありませんが、投稿前に私のコメントについてWindows 2000の部分を削除しました。私は64ビット版ではないことを思い出していたからです。)私が探していた答えではありませんが、ありがとう! :) – Mehrdad

4

x86の実行可能ファイルには、 WOW64エミュレーションレイヤーを持っています(XPについてはWindows Vista +、dunno)。 http://vxheavens.com/lib/vrg02.html

このテクニックはテストされており、Win7とWinVistaで動作します。私はアセンブリで少しスタブを書いて、インポートを解決し、AMD64用にコンパイルされたCコードをロードします。

マイクロソフトでは、変更する可能性があるため前後に切り替えることはできないと言いますが、基本的なアーキテクチャが変更されて128ビットも実行できるようになるまでこれが変わるのは間違いです。 WOW64は周りにあります:)、WOW128 ftl。

+1

+1すごいですよ! :D共有していただきありがとうございます! – Mehrdad

関連する問題