Отладка пользовательских действий WIX не работает

Я попытался отладить мое пользовательское действие. Я поместил Debugger.Break() в пользовательские действия cs. Когда я создаю настраиваемое действие, он создает эти файлы:

myCustomAction.dll
myCustomAction.CA.dll
myCustomAction.pdb

В проекте wix я ссылаюсь на myCustomAction.CA.dll внутри двоичных тегов (а не myCustomAction.dll). Поскольку myCustomAction.CA.pdb не существует, это причина, по которой отладка не работает? Я также попробовал с сообщением и приложил к процессу, когда отображается окно сообщения. Но я получаю следующее сообщение: Не удается найти или открыть файл PDB.

Что я делаю неправильно? У меня версия wix 3.5 и visual studio 2010.

Ответы

Ответ 1

Вот статья, которая мне помогла.

Просто добавьте следующий код в первую строку своего пользовательского действия:

System.Diagnostics.Debugger.Launch();

Затем просто запустите установщик. Когда он начнет выполнение вашего действия, появится всплывающее окно с предложением запустить визуальную студию для отладки.

Ваша справочная библиотека верна, она должна быть *.CA.dll. Также будет работать подход с MessageBox, но вам нужно будет подключиться к процессу rundll32.

Ответ 2

С пользовательскими действиями DTF эти два метода:

1) Поместите MessageBox в свое настраиваемое действие, а затем присоедините Visual Studio к этому процессу. При подключении найдите процесс rundll32 с загруженными native и CLR.

2) Установите переменную среды MsiBreak в имя вашей точки входа и перезагрузите компьютер. DTF будет вызывать отладчик при вызове этого пользовательского действия.

В противном случае мое общее предположение заключается в том, чтобы ваша точка входа была очень тонким шпоном, который соединяет многоразовый класс с MSI. Обычно я создаю отдельный класс, который я могу подавать и тестировать все в консольном приложении, а затем подключать этот класс до DTF. Мне почти никогда не нужно отлаживать настраиваемое действие установщика.

В противном случае я знаю, что это вообще работает.

Ответ 3

Не уверен, в чем проблема с вашей стороны, но вот статья с примером пользовательского действия и метод ее отладки. Он должен работать, как описано в следующей статье: http://www.advancedinstaller.com/user-guide/qa-c-sharp-ca.html

Ответ 4

Это в дополнение к использованию

System.Diagnostics.Debugger.Launch();

В целях улучшения отладки в удаленной системе, например, VM. Я сделал некоторые изменения в файле целей wix, используемом для упаковки .CA.dll, и у меня есть хороший результат.

В состоянии первого Create Item я добавил чек для % (ReferenceCopyLocalPaths.extension) '=='.pdb ' таким образом, большинство моих зависимостей .pdb теперь включены в my.CA.dll и позволяют легче работать с отладочными средствами на удаленной системе.

C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\wix.ca.targets

<Target Name="PackCustomAction"
   Inputs="@(IntermediateAssembly);@(Content);$(CustomActionContents)"
   Outputs="$(IntermediateOutputPath)$(TargetCAFileName)">

    <!-- Find all referenced items marked CopyLocal, but exclude non-binary files. -->
    <CreateItem
     Include="@(ReferenceCopyLocalPaths)"
     Condition=" '%(ReferenceCopyLocalPaths.extension)' == '.pdb' or '%(ReferenceCopyLocalPaths.extension)' == '.dll' or '%(ReferenceCopyLocalPaths.extension)' == '.exe'">
      <Output TaskParameter="Include" ItemName="CustomActionReferenceContents"/>
    </CreateItem>