MSI: чтение свойств из пользовательского действия в модуле слияния (MSM)

Я столкнулся с этой проблемой при попытке построить 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. Но могу ли я получить имя текущего действия из пользовательского действия? Можете ли вы придумать другое решение?

Спасибо!


person Paul    schedule 01.11.2011    source источник


Ответы (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 не поддерживает это.

person cosmin    schedule 01.11.2011
comment
Спасибо за Ваш ответ. Решение № 1 не подходит для меня, потому что эта DLL с настраиваемыми действиями является универсальной, поэтому я не могу жестко запрограммировать в ней GUID. Вот почему мне было интересно, могу ли я получить этот GUID из пользовательского действия (например, прочитав имя действия, а затем извлекая из него GUID). Решение №2 тоже нехорошо, потому что мне нужно включить логику из MSM в MSI. Я имею в виду, что хорошего в MSM, если мне нужно включить часть его логики в MSI? Кстати, я использую WiX 3.0 в Visual Studio. - person Paul; 01.11.2011
comment
Тогда вы в значительной степени застряли. Либо вы найдете способ передать GUID своему пользовательскому действию, либо найдете способ установить свойство MSI. Других решений нет. Кроме того, GUID MSM никак не связан с вашим настраиваемым действием, поэтому вы не можете извлечь его откуда-либо. Можно попробовать, но это ненадежно. Этот GUID обычно жестко запрограммирован, например, как параметр пользовательского действия. - person cosmin; 02.11.2011
comment
Возможно ли, чтобы пользовательское действие увидело имя действия, которое его вызывает? Еще раз спасибо. - person Paul; 02.11.2011
comment
Не совсем. Лучшее, что вы можете сделать, это использовать настраиваемое действие, которое получает дескриптор установки и пытается получить GUID модуля или имя действия из базы данных MSI. - person cosmin; 02.11.2011
comment
Да, я могу получить доступ к базе данных и запросить GUID модуля. Проблема в том, что может быть несколько модулей и, следовательно, несколько GUID, и я не смогу сказать, какой из них вызывает ЦС. Можете ли вы придумать способ получить имя текущего действия? Я могу прочитать свойство SEQUENCE, чтобы определить, какая таблица последовательности выполняется, но как узнать, какое из их действий выполняется? Спасибо. - person Paul; 02.11.2011
comment
Да, я могу получить доступ к базе данных и запросить GUID модуля. Это немного не по теме, но как вы это понимаете? Пожалуйста, не могли бы вы разместить свой код где-нибудь? - person Salaros; 22.02.2013