Registro do Windows de 64 bits versus registro de 32 bits

Eu ouvi na arquitetura do Windows x64, a fim de apoiar a execução de aplicativos x86 e x64, há dois conjuntos separados / diferentes de registro do Windows – um para o aplicativo x86 para acessar e outro para o aplicativo x64 para acessar? Por exemplo, se um COM registra CLSID no conjunto de registros x86, o aplicativo x64 nunca poderá acessar o componente COM pelo CLSID, porque x86 / x64 tem conjuntos diferentes de registro?

Então, minha pergunta é se meu entendimento da amostra acima está correto? Eu também quero obter mais alguns documentos para aprender este tópico, sobre os dois conjuntos diferentes de registro na arquitetura x64. (Eu fiz alguma pesquisa, mas não encontrei nenhuma informação valiosa.)

Eu corri para esta questão não muito tempo atrás. A resposta curta é que, se você executar um aplicativo de 32 bits em uma máquina de 64 bits, as chaves de registro estarão localizadas em um Wow6432Node.

Por exemplo, digamos que você tenha um aplicativo que armazene suas informações de registro em:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

Se você compilar seu aplicativo como um binário de 64 bits e executá-lo em uma máquina de 64 bits, as chaves de registro estarão no local acima. No entanto, se você compilar seu aplicativo como um binário de 32 bits e executá-lo em uma máquina de 64 bits, suas informações de registro agora estão localizadas aqui:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

Isso significa que, se você executar as versões de 32 bits e 64 bits de seu aplicativo na mesma máquina, cada uma delas examinará um conjunto diferente de chaves do Registro.

Sua compreensão está correta. Não haveria necessidade de um aplicativo x64 para acessar os x86 CLSIDs, pois ele nunca conseguiria carregar esses componentes de qualquer maneira e vice-versa.

Se você deseja criar um componente para ser usado tanto por x86 quanto por x64, então você precisa criar um par de dlls, um criado para x86 e outro para x64, e registrar ambos em suas partes apropriadas do registro. O regsrv32.exe na pasta System32 registrará perversamente o componente x64 e o regsrv32.exe na pasta SysWOW64 registrará o componente x86.

Como alternativa, crie um assembly .NET para qualquer CPU que possa ser usado por qualquer arquitetura de CPU.

Eles não são registros separados – um é um subnó do outro, e o sistema operacional faz a virtualização para garantir que os aplicativos de 32 bits obtenham suas chaves e que os aplicativos de 64 bits obtenham suas chaves.

Aqui está o artigo da Wikipedia sobre o registro WOW64, que pode fornecer algumas das informações que você está procurando:

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

Eu corro uma máquina de x64 bits como meu desktop; e nunca encontrei problemas com as diferentes configurações de registro.

Por MSDN, há aparentemente uma diferença: http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx

HTH

Como registrar o assembly .NET para ser usado como COM no aplicativo puro de 64 bits?

Problema: Por padrão, se você habilitar “Register for COM Interop” em configurações de compilation, ele NÃO registrará a biblioteca de tipos para 64 bits.

Solução: Para registrar seu assembly que não está no GAC em uma máquina de 64 bits, abra a janela cmd e faça:

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

Isso eliminará “Classe não registrada erro” ao usar o C ++ nativo para instanciar o assembly .NET como object COM.