質問

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

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

役に立ちましたか?

解決

いいえ、できません。

  

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

     

...

     

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

     

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

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

他のヒント

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top