Registro de Windows de 64 bits vs registro de 32 bits

Escuché en la architecture de Windows x64, para admitir la ejecución de las aplicaciones x86 y x64, hay dos juegos separados / diferentes de registro de Windows: uno para acceder a la aplicación x86 y el otro para acceder a la aplicación x64. Por ejemplo, si un COM registra CLSID en el conjunto de registros x86, entonces la aplicación x64 nunca podrá acceder al componente COM mediante CLSID, porque x86 / x64 tiene diferentes conjuntos de registros.

Entonces, mi pregunta es si mi comprensión de la muestra anterior es correcta. También quiero obtener más documentos para aprender este tema, sobre los dos conjuntos diferentes de registro en la architecture x64. (Hice una búsqueda, pero no encontré ninguna información valiosa).

Me encontré con este problema no hace mucho tiempo. La respuesta corta es que si ejecuta una aplicación de 32 bits en una máquina de 64 bits, sus claves de registro se encuentran debajo de un Wow6432Node.

Por ejemplo, supongamos que tiene una aplicación que almacena su información de registro en:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

Si comstack su aplicación como un binario de 64 bits y lo ejecuta en una máquina de 64 bits, entonces las claves de registro están en la ubicación anterior. Sin embargo, si comstack su aplicación como un binario de 32 bits y lo ejecuta en una máquina de 64 bits, entonces su información de registro ahora se encuentra aquí:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

Esto significa que si ejecuta las versiones de 32 bits y de 64 bits de su aplicación en la misma máquina, cada uno de ellos examinará un conjunto diferente de claves de registro.

Su comprensión es correcta. No habría ninguna necesidad de una aplicación x64 para acceder a los CLSID x86, ya que nunca podría cargar esos componentes de todos modos y viceversa.

Si desea crear un componente para ser usado por x86 y x64, entonces necesita crear un par de dlls, uno para x86 y el otro para x64, y registrar ambos en sus partes apropiadas del registro. El archivo regsrv32.exe en la carpeta System32 registrará perversamente el componente x64 y regsrv32.exe en la carpeta SysWOW64 registrará el componente x86.

De forma alternativa, cree un ensamblado .NET para cualquier CPU que pueda ser utilizada por cualquiera de las architectures de CPU.

No son registros separados: uno es un subnodo del otro, y el sistema operativo realiza la virtualización para asegurarse de que las aplicaciones de 32 bits obtengan sus claves y las aplicaciones de 64 bits obtengan sus claves.

Aquí está el artículo de Wikipedia en el registro WOW64 que puede darle cierta información que está buscando:

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

Ejecuto una máquina de x64 bit como mi escritorio; y nunca me he encontrado con problemas con las diferentes configuraciones de registro.

Por MSDN, aparentemente hay una diferencia: http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx

HTH

¿Cómo registrar el ensamblado .NET para ser utilizado como COM en la aplicación pura de 64 bits?

Problema: de forma predeterminada, si habilita “Registrar para interoperabilidad COM” en la configuración de comstackción, NO registra la biblioteca de tipos para 64 bits.

Solución: para registrar su ensamblaje que no está en GAC en una máquina de 64 bits, abra la ventana de cmd y realice:

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

Esto eliminará el “Error no registrado de clase” cuando se utiliza C ++ nativo para instanciar el ensamblado de .NET como objeto COM.