webdevqa.jp.net

32ビットDLL= Windowsの64ビットプロセスにロードできますか?

最近、c#Windowsサービスを64ビット.netプロセスとして実行するようにアップグレードしました。通常、これは取るに足らないことですが、システムは32ビットのDLL C++で記述されています。これをDLLに変換するオプションではありません。 64ビットなので、DLLを別の32ビットの.netプロセスにラップし、リモート経由で.netインターフェイスを公開しました。

これは非常に信頼できるソリューションですが、システムを単一のプロセスとして実行することをお勧めします。 32ビットのDLLを64ビットのプロセスにロードし、(おそらく、ある種のサンクレイヤーを介して)直接アクセスできる方法はありますか?

34
Lee

いいえ、できません。

16ビットと32ビットの両方のWindowsは、32ビットの線形アドレス空間にありました。用語16および32は、セレクターに対するオフセットのサイズを指します。

...

まず、フルサイズの16ビットポインターと32ビットのフラットポインターが同じサイズであることに注意してください。値0x0123:0x467には32ビットが必要ですが、32ビットポインターも必要です。つまり、ポインタを含むデータ構造は、対応する16ビットと32ビットの間でサイズを変更しません。とても便利な偶然です。

これらの2つの観察は、32ビットから64ビットのサンクでは当てはまりません。ポインターのサイズが変更されました。つまり、32ビット構造を64ビット構造に変換したり、その逆に変換したりすると、構造のサイズが変更されます。また、64ビットのアドレス空間は、32ビットのアドレス空間よりも40億倍大きくなっています。オフセット0x000006fb`01234567の64ビットアドレス空間にメモリがある場合、32ビットコードはそれにアクセスできません。 32ビットフラットコードはこれらの一時アドレスウィンドウを認識しないため、一時アドレスウィンドウを構築できるようにはなりません。彼らはセレクターを放棄しました、覚えていますか?

http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx

26
Jon Grant

.NETアプリケーションがIIS=で実行されているWebサイトである場合、それを回避することができます。

IIS 64ビットマシン上で実行されているASP.NET Webページは、64ビットバージョンのw3wp.exeプロセスによってホストされ、Webページが32ビットDLLを使用している場合はサイト失敗します。

ただし、IISでは、サイトを実行しているアプリケーションプールの詳細設定に移動し、[32ビットアプリケーションを有効にする]をtrueに変更できます。

したがって、64ビットプロセス内で32ビットDLLを実行することはできませんが、代わりに32ビットプロセスとしてw3wp.exeを実行しています。

6
Frode Lillerud