64-битный реестр Windows против 32-битного реестра
Я слышал, что в архитектуре Windows x64 для поддержки запуска приложений x86 и x64 существует два отдельных / разных набора реестра Windows - один для доступа к приложению x86, а другой для доступа к приложению x64? Например, если COM регистрирует CLSID в наборе реестра x86, то приложение x64 никогда не сможет получить доступ к COM-компоненту по CLSID, поскольку x86/x64 имеют разные наборы реестра?
Итак, мой вопрос, является ли мое понимание приведенного выше образца правильным? Я также хочу получить еще несколько документов для изучения этой темы, о двух разных наборах реестра для архитектуры x64. (Я провел поиск, но не нашел никакой ценной информации.)
6 ответов
Я столкнулся с этим вопросом не так давно. Короткий ответ: если вы запускаете 32-битное приложение на 64-битной машине, то его ключи реестра находятся под Wow6432Node.
Например, допустим, у вас есть приложение, которое хранит информацию о реестре в:
HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX
Если вы скомпилируете свое приложение как 64-битный двоичный файл и запустите его на 64-битном компьютере, то ключи реестра находятся в расположении выше. Однако, если вы скомпилируете свое приложение в виде 32-разрядного двоичного файла и запустите его на 64-разрядном компьютере, информация о реестре теперь находится здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX
Это означает, что если вы запустите 32-разрядную и 64-разрядную версии приложения на одном компьютере, то каждый из них будет рассматривать разные наборы ключей реестра.
Ваше понимание верно. Не будет необходимости в приложении x64 для доступа к CLSID x86, так как оно никогда не сможет загрузить эти компоненты, и наоборот.
Если вы хотите создать компонент для использования как x86, так и x64, то вам нужно либо создать пару dll, одну для x86, а другую для x64 и зарегистрировать обе в соответствующих частях реестра. Файл regsrv32.exe в папке System32 будет неправильно регистрировать компонент x64, а файл regsrv32.exe в папке SysWOW64 - компонент x86.
В качестве альтернативы создайте сборку.NET для любого процессора, который может использоваться любой архитектурой процессора.
Это не отдельные реестры - один является подузлом другого, и ОС выполняет виртуализацию, чтобы гарантировать, что 32-битные приложения получают свои ключи, а 64-битные приложения получают свои ключи.
Я использую 64-битную машину в качестве рабочего стола; и я никогда не сталкивался с какими-либо проблемами с различными конфигурациями реестра.
По MSDN, очевидно, есть разница: http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx
НТН
Как зарегистрировать сборку.NET для использования в качестве COM в чистом 64-битном приложении?
Проблема: по умолчанию, если вы включили "Регистрация для взаимодействия COM" в настройках сборки, он НЕ регистрирует библиотеку типов для 64-битной.
Решение. Чтобы зарегистрировать сборку, отсутствующую в GAC, на 64-разрядной машине, откройте окно cmd и выполните:
cd c:\windows\microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled assembly dll"
Это устранит ошибку "Class Not Registered Error" при использовании собственного C++ для создания экземпляра.NET-сборки в качестве COM-объекта.
Вот статья в Википедии о реестре WOW64, которая может дать вам некоторую информацию, которую вы ищете: