Windows 64位registry与32位registry

我听说在Windows x64体系结构上,为了支持运行x86和x64应用程序,有两个单独/不同的Windowsregistry集合 – 一个用于x86应用程序访问,另一个用于x64应用程序访问? 例如,如果一个COM在x86registry中注册CLSID,那么x64应用程序将永远无法通过CLSID访问COM组件,因为x86 / x64有不同的registry集合?

所以,我的问题是,我对上述样本的理解是否正确? 我也想获得更多的文档来学习这个话题,关于x64架构上的两套不同的registry。 (我做了一些search,但没有find任何有价值的信息。)

在此先感谢乔治

不久前我遇到了这个问题。 简单的答案是,如果你在64位机器上运行一个32位的应用程序,那么它的registry键位于Wow6432Node下。

例如,假设您有一个将其registry信息存储在以下位置的应用程序:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

如果您将应用程序编译为64位二进制文​​件并在64位计算机上运行,​​则registry项位于上面的位置。 但是,如果您将应用程序编译为32位二进制文​​件并在64位计算机上运行,​​那么您的registry信息现在位于以下位置:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

这意味着如果你在同一台机器上同时运行你的应用程序的32位和64位版本,那么他们将分别查看一组不同的registry项。

你的理解是正确的。 不需要任何x64应用程序来访问x86 CLSID,因为它永远不会加载这些组件,反之亦然。

如果你想创buildx86和x64使用的组件,那么你需要创build一对dll,一个是为x86构build的,另一个是为x64构build的,并在registry的相应部分注册。 System32文件夹中的regsrv32.exe将反向注册x64组件,SysWOW64文件夹中的regsrv32.exe将注册x86组件。

或者为任何CPU架构都可以使用的任何CPU构build一个.NET程序集。

他们不是独立的注册pipe理机构 – 一个是另一个的子节点,操作系统进行虚拟化,以确保32位应用程序获得他们的密钥,64位应用程序获得他们的密钥。

这里是WOW64registry中的Wikipedia文章,它可能会给你一些你正在寻找的信息:

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

我运行一个x64位机器作为我的桌面; 我从来没有遇到任何与registryconfiguration不同的问题。

每MSDN,显然是有所不同: http : //msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx

HTH

如何注册.NET程序集在纯64位应用程序中用作COM?

问题:默认情况下,如果在编译设置中启用“注册COM Interop”,则不会为64位注册types库。

解决scheme:要在64位计算机上注册不在GAC中的程序集,请打开cmd窗口并执行以下操作:

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

当使用本地C ++来将.NET程序集实例化为COM对象时,这将消除“类未注册的错误”。