Добавить пользовательские ключи реестра с помощью установщика

Я написал надстройку для Solidworks (dll). Чтобы Solidworks мог его найти, необходим дополнительный раздел реестра, который я установил в файле ComRegistryFunction. Когда я компилирую его и регистрирую .dll с помощью regasm.exe \tlb, все работает как задумано.

Теперь я хочу распространять надстройку, и я искал проекты установки, чтобы все было хорошо упаковано. Я много гуглил, но, честно говоря, довольно сложно найти достоверную информацию по этой теме. Вот что я сделал:

  • Добавьте мою dll в качестве «основного вывода» в проект установки
  • Для этого файла установите для параметра «Регистрация» значение «vsdrpCOM».

Однако программа установки не устанавливает пользовательские ключи реестра (похоже, она не запускает функцию ComRegisterFunction моего класса).

Мне удалось заставить его работать, вручную добавив эти разделы реестра на вкладку "Реестр" проекта установки. Но это означает, что я должен вручную вводить GUID класса, а также описание и название, хотя все это уже указано в классе. Я знаю, что когда-нибудь в будущем забуду изменить то или иное.

Как я могу заставить установщик автоматически извлекать эти ключи реестра и устанавливать их?

Я использую Visual Studio 2017 и .Net v4.


person Dux    schedule 30.09.2018    source источник


Ответы (2)


Вы правы, функция установщика Windows не вызывает код функции регистрации.

Настройка vsdrpCOM должна выполнять большую часть регистрации, и она должна извлекаться во время сборки в таблицу классов файла MSI и некоторые в таблицу реестра — вы можете проверить, открыв файл MSI в Orca и посмотрев, что было извлечено. Вы не сказали, чего именно не хватает, учитывая, что в реестре есть записи классов и интерфейсов. Другая путаница может заключаться в том, предназначен ли ваш файл MSI для 32-разрядной или 64-разрядной версии, и где вы ожидаете создания записей реестра (classes\root против software\classes и собственный 64-разрядный против WoW6432). Также обратите внимание, что установщик Windows буквально воспринимает настройку «Только я» для каждого пользователя, поэтому вы будете регистрировать COM для каждого пользователя, а не для каждой системы.

Это может помочь, старые, но эти проекты не изменились за эти годы:

https://www.red-gate.com/simple-talk/dotnet/visual-studio/build-and-deploy-a-net-com-assembly/

Поэтому проверьте архитектуру и настройки «Все/Только я» и просмотрите эти таблицы MSI, чтобы узнать, что там.

person PhilDW    schedule 19.10.2018

Если у вас есть время, я настоятельно рекомендую перейти с проекта установки VS на wix. У него крутая кривая обучения, но он намного опережает его по функциональности и настраиваемости. Чтобы решить вашу проблему с wix, вы должны использовать утилиту heat, которая поставляется как часть набора инструментов и генерирует конфигурацию xml, которая содержит регистрацию com на основе вашей dll. Я верю, что он будет включать пользовательские регистрации, но на всякий случай сначала проверьте это.

С другой стороны, если вы не планируете в будущем создавать установщики какой-либо значительной сложности, я думаю, вы можете сделать собственное действие для проекта установки VS и вызвать regasm вручную с помощью Process.Start(). Или еще лучше поместите свои пользовательские регистрации в само настраиваемое действие.

person Vlad    schedule 02.10.2018
comment
Спасибо за ваш ответ. Не могли бы вы уточнить, как добавить регистрацию в пользовательское действие? - person Dux; 03.10.2018
comment
Вы просто берете код из ComRegistryFunction и помещаете его в пользовательское действие. Если вы спрашиваете, как добавить само пользовательское действие - это относительно тривиальная задача, в Интернете есть много руководств. Google добавляет пользовательское действие для проекта установки Visual Studio C# - person Vlad; 04.10.2018