#dll #module #windows-installer #custom-action #merge-module
#dll #модуль #windows-установщик #пользовательское действие #модуль слияния
Вопрос:
Я столкнулся с этой проблемой при попытке создать MSM. По-видимому, свойства модуля (и все идентификаторы, если на то пошло) переименовываются во время генерации модуля путем добавления идентификатора GUID модуля в конце его имени. Например, свойство «MY_PROPERTY» переименовывается в «MY_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72» (предполагается, что 803A3089-928F-46F1-BBAE-CBD39A7D6A72 является идентификатором GUID модуля). Я считаю, что это механизм, используемый для предотвращения конфликтов между несколькими модулями, пытающимися использовать идентификаторы с одинаковым именем.
Из MSM мне нужно вызвать пользовательское действие DLL, для которого требуется установить определенное свойство с некоторым значением (назовем его «THE_PROPERTY»). Проблема в том, что THE_PROPERTY переименовывается, как описано выше, в THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72, поэтому пользовательское действие никогда не находит свойство и завершается с ошибкой.
Есть ли какой-либо способ решить эту проблему? Я подумывал об изменении пользовательского действия таким образом, чтобы оно пыталось (каким-то образом) определить GUID модуля, из которого оно вызывается. Одним из способов сделать это может быть просмотр текущего имени действия, которое также должно включать идентификатор GUID. Но могу ли я получить имя текущего действия из пользовательского действия? Можете ли вы придумать другое решение?
Спасибо!
Ответ №1:
Действительно, доступ к свойствам внутри модуля слияния осуществляется с помощью идентификатора GUID модуля после имени свойства.
Хорошее решение — заставить пользовательское действие обращаться к THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72 вместо THE_PROPERTY.
Другим решением является использование пользовательского действия типа 51:
- в MSI создайте набор свойств с форматированным пользовательским действием (тип 51)
- настройте его, чтобы установить для THE_PROPERTY значение:
[THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72]
- запланируйте его перед пользовательским действием, которое считывает THE_PROPERTY
Таким образом, свойство модуля слияния сохраняется в свойстве MSI, которое имеет имя, используемое вашим пользовательским действием.
Пользовательские действия типа 51 добавляются по-разному для каждого средства разработки настроек. Если вам нужны точные инструкции, пожалуйста, укажите инструмент настройки, который вы используете. Visual Studio этого не поддерживает.
Комментарии:
1. Спасибо за ваш ответ. Решение № 1 мне не подходит, потому что эта пользовательская библиотека DLL действий является общей, поэтому я не могу жестко закодировать в ней идентификатор GUID. Вот почему мне было интересно, могу ли я получить этот идентификатор GUID из пользовательского действия (например, прочитав имя действия и затем извлекая из него идентификатор GUID). Решение № 2 тоже не очень хорошо, потому что я должен включить логику из MSM в MSI. Я имею в виду, что хорошего в MSM, если мне нужно включить часть его логики в MSI? Кстати, я использую WiX 3.0 в Visual Studio.
2. Тогда вы в значительной степени застряли. Либо вы найдете способ передать GUID своему пользовательскому действию, либо найдете способ установить свойство MSI. Других решений нет. Кроме того, идентификатор GUID MSM никак не связан с вашим пользовательским действием, поэтому вы не можете извлечь его откуда-либо. Вы могли бы попробовать, но это ненадежно. Этот идентификатор GUID обычно жестко запрограммирован, например, как параметр пользовательского действия.
3. Возможно ли, чтобы пользовательское действие видело имя действия, которое его вызывает? Еще раз спасибо.
4. Не совсем. Лучшее, что вы можете сделать, это использовать пользовательское действие, которое получает дескриптор установки, и попытаться получить идентификатор GUID модуля или имя действия из базы данных MSI.
5. Да, я могу получить доступ к базе данных и запросить идентификатор GUID модуля. Проблема в том, что может быть несколько модулей и, следовательно, несколько идентификаторов GUID, и я не смогу определить, какой из них вызывает CA. Можете ли вы придумать способ получения имени текущего действия? Я могу прочитать свойство SEQUENCE, чтобы определить, какая таблица последовательностей выполняется, но как мне узнать, какие из их действий выполняются? Спасибо.