Windows 64-bit registry v. S. Registre 32 bits
j'ai entendu sur l'architecture Windows x64, afin de soutenir pour exécuter les deux x86 et x64 application, Il ya deux ensembles séparés/différents de Windows registry -- un pour l'application x86 à l'accès et l'autre pour l'application x64 à l'accès? Par exemple, si un COM enregistre CLSID dans le jeu x86 de registry, alors l'application x64 ne pourra jamais accéder au composant COM par CLSID, parce que x86/x64 ont des jeux différents de registry?
Donc, ma question est de savoir si ma compréhension de l'exemple ci-dessus est correcte? Je veux également obtenir plus de documents pour apprendre ce sujet, sur les deux ensembles différents de Registre sur l'architecture x64. (J'ai fait quelques recherches, mais je n'ai trouvé aucune information valable.)
6 réponses
je suis tombé sur cette question il n'ya pas longtemps. La réponse courte est que si vous exécutez une application 32 bits sur une machine 64 bits alors ses clés de Registre sont situés sous un Wow6432Node.
par exemple, disons que vous avez une application qui stocke ses informations de Registre sous:
HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX
Si vous compilez votre application en 64 bits binaires et de l'exécuter sur un ordinateur 64 bits alors les clés de registre sont dans l'emplacement ci-dessus. Cependant, si vous compilez votre application comme un 32 bit binaire et l'exécuter sur un ordinateur 64 bits, alors vos informations de registre se trouve maintenant ici:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX
cela signifie que si vous exécutez à la fois les versions 32 bits et 64 bits de votre application sur la même machine, alors ils regarderont chacun un ensemble différent de clés de registre.
Votre compréhension est correcte. Il n'y aurait pas besoin d'une application x64 pour accéder aux CLSIDs x86 car elle ne pourrait jamais charger ces composants de toute façon et vice versa.
si vous voulez créer un component pour x86 et x64, alors vous devez créer une paire de dlls l'un construit pour x86 et l'autre pour x64 et enregistrer les deux dans leurs parties appropriées du registre. Le regsrv32.exe dans le dossier System32 enregistrera de manière perverse le composant x64 et le regsrv32.exe dans le dossier SysWOW64 enregistrera le composant x86.
alternativement construisez un assemblage .NET pour N'importe quel CPU qui peut être utilisé par n'importe quelle architecture CPU.
ce ne sont pas des registres séparés--l'un est un sous-code de l'autre, et le système d'exploitation fait de la virtualisation pour s'assurer que les applications 32 bits obtiennent leurs clés et les applications 64 bits leurs clés.
Voici L'article Wikipedia sur le registre WOW64 qui peut vous donner quelques informations que vous recherchez:
j'exécute une machine x64 bit comme mon bureau; et je n'ai jamais rencontré de problèmes avec les différentes configurations de registre.
par MSDN, il y a apparemment une différence: http://msdn.microsoft.com/en-us/library/ms724072(SV.85).aspx
HTH
comment enregistrer .net assembly pour être utilisé comme COM dans une application pure 64 bits?
Problème: Par défaut, si vous activez "Register for COM Interop" dans les paramètres de construction, il n'enregistre pas la bibliothèque de type pour 64 bits.
Solution: Pour enregistrer votre assemblage qui n'est pas en GAC sur une machine 64 bits, ouvrez la fenêtre cmd et faites:
cd c:\windows\microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled assembly dll"
ceci éliminera "Class Not Registered Error" lors de L'utilisation de natif C++ pour instanciate. net assemblée en tant qu'objet COM.