Разбираемся в подробной трассировке .MSI — запускаем CustomAction

Разбираемся в подробной трассировке .MSI. Я создал .MSI с помощью VisualStudio 2008.

Вот предыстория того, что я пытаюсь сделать: http://xmlpreprocess.codeplex.com/Thread/View.aspx?ThreadId=79454

Цель состоит в том, чтобы запустить программу с именем XmlPreprocess.exe, подобную этой: xmlpreprocess.exe /x:"SettingsFileGenerator.xml" /i:"web.config" /e:QA /v

Параметр /x: взят из одной из моих форм пользовательского интерфейса, а значение /e: получено из четырех переключателей.

Я устанавливаю для свойства "InstallerClass" значение False, а для свойства "CustomActionData" значение: /x:"[SETTINGSFILE]" /i:"[TARGETDIR]web.config" [CUSTOMSETTINGS] /e:[ENVIRONMENTBUTTON] и оставляю свойство "Аргументы" пустые.

Вот что говорит мне след. Похоже, что мои параметры собираются в соответствующие места (я выбрал «QA» из переключателя). Ошибка та же самая, которую я вижу на экране графического интерфейса: «Программа, запущенная как часть установки, не завершилась должным образом. Обратитесь в службу поддержки или к поставщику пакета». Я не уверен, является ли информация ErrorIcon просто шумом или имеет значение.

MSI (s) (A4:58) [10:46:09:130]: Executing op: CustomActionSchedule(Action=_78D3A615_0FDF_491D_8BD0_4AA0A0DAE3C2,ActionType=3090,Source=C:\inetpub\wwwroot\TFBIC.RCT.WCFWebServicesSetup\XmlPreprocess.exe,,CustomActionData=/x:"c:\Source\TFBIC.RCT.BizTalk\TFBIC.RCT.BizTalk.Deployment\EnvironmentSettings\SettingsFileGenerator.xml" /i:"C:\inetpub\wwwroot\TFBIC.RCT.WCFWebServicesSetup\web.config"  /e:QA)
MSI (s) (A4:58) [10:46:09:728]: Note: 1: 1722 2: _78D3A615_0FDF_491D_8BD0_4AA0A0DAE3C2 3: C:\inetpub\wwwroot\TFBIC.RCT.WCFWebServicesSetup\XmlPreprocess.exe 4:  
MSI (s) (A4:58) [10:46:09:728]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (c) (E0:C8) [10:46:09:763]: Note: 1: 2262 2: Error 3: -2147287038 
DEBUG: Error 2835:  The control ErrorIcon was not found on dialog ErrorDialog
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2835. The arguments are: ErrorIcon, ErrorDialog, 
**Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor.**  Action _78D3A615_0FDF_491D_8BD0_4AA0A0DAE3C2, location: C:\inetpub\wwwroot\TFBIC.RCT.WCFWebServicesSetup\XmlPreprocess.exe, command:  
MSI (s) (A4:58) [10:46:11:630]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (s) (A4:58) [10:46:11:630]: Product: TFBIC.RCT.WCFWebServices -- Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor.  Action _78D3A615_0FDF_491D_8BD0_4AA0A0DAE3C2, location: C:\inetpub\wwwroot\TFBIC.RCT.WCFWebServicesSetup\XmlPreprocess.exe, command:  

Action ended 10:46:11: InstallExecute. Return value 3.
MSI (s) (A4:58) [10:46:11:633]: User policy value 'DisableRollback' is 0
MSI (s) (A4:58) [10:46:11:633]: Machine policy value 'DisableRollback' is 0

ПРИМЕЧАНИЕ. Получил приведенную выше трассировку, выполнив следующие действия:

msiexec /i "TFBIC.RCT.WCFWebServicesSetup.msi" /L*V "C:\logs\WebServiceInstall.log"

Обновление: на основе комментариев ниже - XmlPreprocess.exe (мой CustomAction) возвращает ненулевой код возврата. Итак, как я могу отладить это? Мне нужно увидеть результаты, которые обычно отображаются в командном окне.

Обновление от 01/07: похоже, что это невозможно отладить, не видя вывод программы - это то, что мне действительно нужно. Когда установщик выдает ошибку, я могу видеть файлы в этом каталоге, пока не нажму кнопку «ОК», и он удалит их все. Я иду в командную строку, набираю xmlpreprocess.exe, затем копирую/вставляю точно такую ​​же строку из журнала выше "/x:"c:\Source\TFBIC.RCT.BizTalk\TFBIC.RCT.BizTalk.Deployment\EnvironmentSettings\SettingsFileGenerator .xml" /i:"C:\inetpub\wwwroot\TFBIC.RCT.WCFWebServicesSetup\web.config" /e:QA" и работает нормально.

Я понимаю точку зрения Райана об отсутствующем файле, спасибо за это. Но могут быть десятки потенциальных ошибок, которые должны быть четко отображены в выходных данных программы XmlPreprocess. Наверняка есть возможность посмотреть результат?

Два потенциально отсутствующих файла: 1) сам web.config (он там) 2) имя файла, который вводит пользователь.

Насколько я могу судить, нет способа проверить, что пользователь ввел действительное имя файла, и в диалоговых окнах установки нет «средства выбора файлов». Правильный? или нет?

Таким образом, даже если пользователь действительно ввел неправильное имя файла, мне нужно дать ему лучшее сообщение, чем «Программа, запущенная как часть установки, не завершилась должным образом. Обратитесь в службу поддержки или к поставщику пакета».

Может быть, мне следует написать свою собственную оболочку C # для XmlPreprocess и вызвать ее, а затем перехватить вывод и прочитать его ???


person NealWalters    schedule 05.01.2010    source источник


Ответы (2)


Как в вашем предыдущий вопрос, где я предложил использовать cmd.exe /C XmlPreProcess.exe ... для перенаправления, для отладки вы можете попробовать использовать /K вместо /C. Тогда любой вывод должен остаться, и вы сможете работать в контексте MSI во время ошибки.

Я действительно подозреваю, что проблема заключается в планировании вашего пользовательского действия. Если это действие является немедленным, запланированным перед InstallFinalize и предназначенным для работы с файлом, который вы будете устанавливать, оно будет выполнено до того, как файлы будут установлены в ожидаемое вами место. Правильное решение для этого, как правило, состоит в том, чтобы запустить действие в сценарии (также называемое отложенным), чтобы, запланировав его между InstallFiles и InstallFinalize, оно фактически выполнялось в соответствующем месте.

Что касается предоставления улучшенных ошибок для ваших конечных пользователей или предоставления им возможности просматривать файл, они оба будут выполнять настраиваемые действия и, вероятно, должны быть действиями DLL (действия EXE могут обеспечивать только обратную связь «пройдено/не пройдено»). Это будет ваш выбор, лучше (или проще) предоставить диалоговое окно просмотра или проверить путь, указанный пользователем. Я не уверен, сколько из этого вы можете сделать в проекте установщика Visual Studio (это то, что я предполагаю, что вы используете свои теги).

person Michael Urman    schedule 08.01.2010
comment
Спасибо, я забыл о предыдущем вопросе, который я задал, потому что думал, что эта трассировка станет панацеей. Вероятно, я попробую альтернативный подход, включив веб-службы в BizTalk Deployment Framework (BTDF), поскольку они будут развернуты на одном и том же сервере в одно и то же время. Раньше я делал несколько установщиков с помощью NSI, но это первая причудливая установка, которую я пробовал с помощью встроенных инструментов Microsoft Visual Studio (не слишком впечатлен). - person NealWalters; 08.01.2010
comment
Для всех в мире BizTalk вот обсуждение того, что я буду пробовать: biztalkdeployment.codeplex.com/WorkItem/ - person NealWalters; 08.01.2010

Да, ErrorIcon — это просто шум, и его можно игнорировать. Сейчас я нахожусь в процессе удаления этого «шума» из моего MSI, чтобы я мог правильно отлаживать.

Ошибка вызвана тем, что ваше пользовательское действие возвращает ошибку Windows 1722.

Запуск «net helpmsg 1722» в командной строке cmd дает результат;

 The RPC server is unavailable.

Таким образом, эта команда делает что-то, что либо зависит от службы локального сервера RPC (не запущена, что странно, потому что я думаю, что это критично для Windows), либо удаленный сервер сообщает об этом.

person Ryan O'Neill    schedule 06.01.2010
comment
Вы получили правильную ошибку из журнала, но неправильную интерпретацию. В сообщениях об ошибках установщика Windows (msdn.microsoft.com/en -us/library/aa372835(VS.85).aspx), 1722, как показано в журнале. Это означает, что программа вернула ненулевой код ошибки. Либо программа сообщает об ошибке, либо ей нужно игнорировать код возврата. - person Michael Urman; 06.01.2010
comment
Спасибо. Ненулевой код возврата имеет больше смысла. Но я все еще не понимаю, как это отлаживать? Мне нужно увидеть вывод того, что обычно отображается в командном окне. Я надеялся, что, может быть, дело в следе. Это просто XmlPreprocess.exe (предоставляется CodePlex). Он массирует файл web.config. Естественно, я могу запустить его вне установки, и он работает. Конечно, он может выдавать ошибки, но мне нужно знать, что это за ошибки. Как я могу это сделать? - person NealWalters; 06.01.2010
comment
Хорошо, еще раз. Ошибка Win32 обычно где-то там, и я думаю, что это номер -2147xxxx. Так что введите это в calc (или скопируйте / вставьте), а затем переключитесь на шестнадцатеричный. Игнорируйте все начальные символы FFFF, так как это связано с битом знака. У вас должен быть номер 80030002, который можно найти в Google. При поиске это выглядит как простая ошибка «Файл не найден». Могу ошибаться, но похоже. Попробуйте одновременно запустить procmon, чтобы увидеть, какие файлы могут отсутствовать, или скопируйте содержимое MSI в цель вручную и запустите его из консоли. - person Ryan O'Neill; 07.01.2010