44

Windows x64 アーキテクチャでは、x86 と x64 アプリケーションの両方の実行をサポートするために、2 つの別個の/異なる Windows レジストリ セットがあると聞きました.1 つは x86 アプリケーションがアクセスし、もう 1 つは x64 アプリケーションがアクセスしますか? たとえば、COM がレジストリの x86 セットに CLSID を登録すると、x86/x64 ではレジストリのセットが異なるため、x64 アプリケーションは CLSID によって COM コンポーネントにアクセスできなくなります。

それで、私の質問は、上記のサンプルの私の理解が正しいかどうかです? また、x64 アーキテクチャの 2 つの異なるレジストリ セットについて、このトピックを学習するためのドキュメントをさらに入手したいと考えています。(いろいろ調べましたが、有力な情報は見つかりませんでした。)

4

6 に答える 6

59

少し前にこの問題に遭遇しました。簡単に言えば、32 ビット アプリケーションを 64 ビット マシンで実行する場合、そのレジストリ キーは Wow6432Node の下にあるということです。

たとえば、次の場所にレジストリ情報を保存するアプリケーションがあるとします。

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX

アプリケーションを 64 ビット バイナリとしてコンパイルし、64 ビット マシンで実行すると、レジストリ キーは上記の場所にあります。ただし、アプリケーションを 32 ビット バイナリとしてコンパイルし、64 ビット マシンで実行すると、レジストリ情報は次の場所にあります。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX

つまり、アプリケーションの 32 ビット バージョンと 64 ビット バージョンの両方を同じマシンで実行すると、それぞれが異なるレジストリ キーのセットを参照することになります。

于 2009-05-15T17:13:26.443 に答える
7

あなたの理解は正しいです。x64 アプリが x86 CLSID にアクセスする必要はありません。これらのコンポーネントをロードすることはできず、その逆も同様であるためです。

x86 と x64 の両方で使用するコンポーネントを作成する場合は、x86 用と x64 用にビルドされた dll のペアを作成し、両方をレジストリの適切な部分に登録する必要があります。System32 フォルダー内の regsrv32.exe は x64 コンポーネントを逆に登録し、SysWOW64 フォルダー内の regsrv32.exe は x86 コンポーネントを登録します。

または、いずれかの CPU アーキテクチャで使用できる任意の CPU 用の .NET アセンブリをビルドします。

于 2009-05-15T17:05:23.623 に答える
4

それらは別個のレジストリではありません。一方は他方のサブノードであり、OS は仮想化を行って、32 ビット アプリがキーを取得し、64 ビット アプリがキーを取得するようにします。

于 2009-05-15T17:07:29.530 に答える
1

デスクトップとして x64 ビット マシンを実行しています。また、さまざまなレジストリ構成で問題が発生したことはありません。

MSDN によると、明らかに違いがあります: http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx

HTH

于 2009-05-15T17:03:41.270 に答える
1

WOW64 レジストリに関するウィキペディアの記事を次に示します。探している情報の一部が得られる可能性があります。

http://en.wikipedia.org/wiki/WOW64

于 2009-05-15T17:03:57.917 に答える
1

純粋な 64 ビット アプリケーションで COM として使用する .NET アセンブリを登録する方法は?

問題: 既定では、ビルド設定で [COM 相互運用機能の登録] を有効にすると、64 ビットのタイプ ライブラリが登録されません。

解決策: 64 ビット マシンで GAC にないアセンブリを登録するには、cmd ウィンドウを開いて次の操作を行います。

cd c:\windows\microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled assembly dll"

これにより、ネイティブ C++ を使用して .NET アセンブリを COM オブジェクトとしてインスタンス化する際の "Class Not Registered Error" が解消されます。

于 2009-06-09T15:01:39.610 に答える