34

最近、ac#Windowsサービスを64ビットの.netプロセスとして実行するようにアップグレードしました。通常、これは簡単なことですが、システムはC++で記述された32ビットDLLを使用します。このDLLを64ビットに変換するオプションはないため、DLLを別の32ビット.netプロセスでラップし、リモート処理を介して.netインターフェイスを公開しました。

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

4

2 に答える 2

26

いいえ、できません。

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

于 2008-10-22T10:29:47.957 に答える
6

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

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

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

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

于 2008-11-14T23:00:56.917 に答える