Как правильно зарегистрировать сборку .NET во время установки без вызова RegAsm?

У меня есть внепроцессный сервер, видимый в .NET COM, назовем его Server.exe. Мне нужно иметь возможность зарегистрировать его в системах, в которых могут быть установлены разные версии .NET framework, поэтому я бы не хотел вызывать RegAsm по его полному имени (которое, как правило, содержит номер версии .NET framework).

Я пытался заставить его работать, экспортируя патч реестра и импортируя его с помощью:

regasm /regfile:foo.reg Server.exe
reg import foo.reg

Однако применение патча не регистрирует компонент должным образом. Я могу зарегистрировать его напрямую с помощью regasm. Я админ. Что делает regasm, что не записывает в патч реестра?


person Wug    schedule 02.11.2012    source источник
comment
Я подозреваю, что у меня могут возникнуть проблемы с перенаправлением реестра и 32- и 64-битными программами. Подожди, пока я исследую   -  person Wug    schedule 02.11.2012
comment
.NET не поддерживает запись внепроцессных серверов напрямую. Когда вы используете Regasm таким образом, сервер будет зарегистрирован как внутрипроцессный сервер. Единственный способ приблизиться - использовать хостинг COM +. msdn.microsoft.com/en-us/library/   -  person Hans Passant    schedule 02.11.2012
comment
Это ничего не объясняет, почему это работает, если я использую regasm Server.exe, а не если я использую regasm /regfile:foo.reg Server.exe; reg import foo.reg, хотя они предположительно делают то же самое.   -  person Wug    schedule 02.11.2012


Ответы (1)


Это связано с тем, что RegAsm не работает и ведет себя непоследовательно между обычной регистрацией и отложенной регистрацией посредством внесения исправлений в реестр, а из-за своей квантовой природы он будет создавать отдельные записи реестра в зависимости от того, какое поведение требуется. Использование RegAsm для моделирования квантовых вычислений между суперпозицией внутрипроцессных и внепроцессных серверов еще предстоит исследовать.

Чтобы решить эту проблему:

  1. Используйте RegAsm /regfile:foo.reg Server.exe для создания патча реестра.
  2. Используйте RegAsm /register Server.exe, чтобы правильно зарегистрировать тип.
  3. Откройте файл foo.reg в блокноте. Некоторые ключи, указанные в foo.reg, будут иметь путь в формате: HKEY_CLASSES_ROOT\CLSID\{YOUR-CLSID}. Откройте regedit и найдите этот ключ.
  4. Экспортируйте этот ключ как bar.reg и откройте его в блокноте.
  5. Скопируйте все записи из bar.reg в foo.reg и удалите все существующие записи из foo.reg, которые добавляют значения к любой части HKEY_CLASSES_ROOT\CLSID\{YOUR-CLSID}.

    • Keep in mind that if you are on a 64 bit system, registry redirection will likely mean this key is stored in HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{YOUR-CLSID} instead of HKEY_CLASSES_ROOT\CLSID\{YOUR-CLSID}. To ensure consistent deployment over both 32 and 64 bit systems, remove Wow6432Node\ from the path (leaving the paths as they would look on a 32 bit system) and apply them to the registry using reg import foo.reg /reg:32. /reg:32 is a semi-documented switch which should work on both 32 and 64 bit versions of windows which will enable registry reflection even on 64 bit versions of reg, thus making sure the entries are installed in the right place.
person Wug    schedule 02.11.2012
comment
Оказывается, это еще не все. - person Wug; 03.11.2012