2015-01-14 7 views
0

У меня возникли проблемы с пользовательскими действиями в моем проекте. Некоторые работают, а некоторые нет. У меня есть два проекта проекта C# CustomAction Project и Setup Project в VS 2012. Мои пользовательские действия выглядят так. Эти два первых действия не вызывают проблемы. Только третий не работает.Пользовательские действия в WiX 3.8

[CustomAction] 
public static ActionResult WriteToConfigStore(Session session) 
{ 
    ... 
} 

[CustomAction] 
public static ActionResult CleanConfigStore(Session session) 
{ 
    ... 
} 

[CustomAction] 
public static ActionResult CheckPrograms(Session session) 
{ 
    string s = ""; 

    Process[] p = Process.GetProcesses(); 

    foreach (Process ps in p) 
    { 
     s += ps.ProcessName + ";"; 
    } 

    MessageBox.Show(s); 

    return ActionResult.Success; 
} 

I, определяющие пользовательские действия, как это:

<Binary Id="CustomActionsId" SourceFile="$(var.ResourcesDir)\DriverCA.CA.dll" /> 
<CustomAction Id="ca_writeToConfigStoreId" BinaryKey="CustomActionsId" DllEntry="WriteToConfigStore" Execute="deferred" Return="check" /> 
<CustomAction Id="ca_cleanConfigStoreId" BinaryKey="CustomActionsId" DllEntry="CleanConfigStore" Execute="deferred" Return="check" /> 
<CustomAction Id="ca_setParameter" Return="check" Property="ca_writeToConfigStoreId" Value="param1=.;param2=;param3=;param4=;param5=IviDriver1.0, IviSwtch1.0" /> 
<CustomAction Id="ca_setCleanParameter" Return="check" Property="ca_cleanConfigStoreId" Value="param1=;" /> 
<CustomAction Id="ca_checkProgramsId" BinaryKey="CustomActionsId" DllEntry="CheckPrograms" Execute="deferred" Return="check" /> 

Моя установить последовательность вида:

<InstallExecuteSequence> 
    <Custom Action="ca_setParameter" Before="InstallFinalize" /> 
    <Custom Action="ca_setCleanParameter" Before="InstallFinalize" /> 
    <!--Call only when not uninstall (install, change, repair)--> 
    <Custom Action="ca_writeToConfigStoreId" After="ca_setParameter">NOT(REMOVE="ALL")</Custom> 
    <!--Call only when uninstall or upgrade--> 
    <Custom Action="ca_cleanConfigStoreId" After="ca_setCleanParameter">REMOVE="ALL"</Custom> 
    <!--Call only when not install--> 
    <Custom Action="ca_checkProgramsId" After="MsiUnpublishAssemblies">Installed</Custom> 
</InstallExecuteSequence> 

Когда я комментирую <Custom Action="ca_checkProgramsId" After="MsiUnpublishAssemblies">Installed</Custom> все работает отлично. Но когда эта часть не комментируется, тогда при удалении программы я получил ошибку There is problem with this Windows Installer package. A DLL required for this install to complete could not be run.. Я не вижу никакой ошибки. Каждое имя и идентификатор верны. Я не использую PInvoke или что-то в этом роде.

UPDATE: Цель пользовательского действия, чтобы проверить, если некоторые процессы выполняются или нет, и interrup процесс удаления в соответствии с ним. Настройка для каждой системы, и у меня не было проблем с ящиками сообщений в любых других пользовательских действиях. Я решил это с другим проектом пользовательских действий, который сам по себе имеет проблемы с настраиваемыми действиями, но в остальном я использую точно такие же методы и определения установки (исключая, конечно, другое определение dll). Однако не знаю, в чем проблема.

+0

Это поможет понять, какова ваша конечная цель. Часто пользовательские действия не нужны. –

+0

Мне нужно проверить, запущены ли какие-либо процессы или нет, и переустановить процесс в соответствии с ним. Я обновил свой вопрос. – benderto

ответ

0

несколько вещей, которые могли бы помочь:

Вам может потребоваться привилегии для перечисления процессов в системе - я не могу сказать, если ваши настройки для каждого пользователя (и, следовательно, не повышены) или в систему (и повышен через запрос высоты).

Я не уверен, что вы можете сделать MessageBox.Show, если пользовательские действия повышены (и запущены с системной учетной записью), потому что публикация петли сообщений Windows на рабочем столе является дырой в безопасности.

Как вы думаете, в чем проблема решения MsiPublishAssemblies? Для меня это не очевидно, почему вы думаете, что это помогает. Я не думаю, что это связано с проблемой, если у вашего кода нет зависимости от сборки в GAC, потому что она не будет установлена ​​до InstallFinalize (что действительно важно, а не публикации сборок).

+0

MsiPublishAssemblies запускается в фазе фиксации, поэтому планирование «после» на самом деле может быть «до», так как все отложенные раньше до совершения. –

+0

Настройка на систему, и у меня не было проблем с ящиками сообщений в любых других настраиваемых действиях. Я обновил свой вопрос. – benderto

+0

Проблема по-прежнему в том, что это ваш код, который терпит неудачу, поэтому вам нужно отладить фактическую точку сбоя в коде, которая выходит из строя. Я бы все же подозревал MessageBox из-за того, что я сказал, поэтому я бы не отбросил его так быстро. Если это за систему, она поднимается? Если ваши вызовы MessageBox действительно работают, самым простым способом найти сбой является вызов MessageBox после каждой строки кода в этом методе и просмотр того, что происходит. Кроме того, лично я бы НЕ использовал строку: я бы использовал StringBuilder. – PhilDW

0

Не настоящий ответ, но, надеюсь, больше, чем комментарий.

Debug сложнее:

  1. Упростить CustomAction CheckPrograms просто установить фиктивную-свойство и вернуть ActionResult.Success. Затем запустите msiexec с подробным протоколированием, чтобы узнать, достигли ли вы кода, задающего свойство.
  2. Если 1) показывает параметр фиктивного свойства, добавьте либо a) отображение MessageBox со статической строкой, либо b) перечисление процессов (возможно, на следующем мини-шаге), поместив некоторую информацию об этих перечисленных процессов в фиктивное свойство, чтобы узнать, получаете ли вы ожидаемые значения.
  3. Если 1) не показывает настройку фиктивного свойства, попробуйте интегрировать упрощенную CustomAction в другую точку (или что-нибудь еще, что вы придумали).

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

Предоставлять больше информации:

  1. Вы упрощать свой вопрос, чтобы проиллюстрировать эту проблему? Если да, то эта упрощенная версия все еще воспроизводит ошибку? (Например, очень важный момент: вы опустили некоторые CustomActions?)
  2. В качестве последнего средства придумайте минималистский пример, инициирующий ошибку и сделавший ее доступной где-то. Может быть, кто-то смотрит на это.
+0

Как я уже сказал в другом комментарии: Дело в том, что пользовательское действие никогда не вызывается из настройки. Настройка просто не может найти его. И я знаю, что он там, я посмотрел. Я решил это, как я описал в конце вопроса, но я до сих пор не могу понять, почему он не работает с единой dll. - Я попытался упростить его только для этого индивидуального действия. Это не сработало. Создание нового проекта для пользовательских действий помогло. – benderto

+0

При написании «Я попытался упростить его только для этого специального действия» вы только опустили CA в конфигурации wix (т. Е. Удалили xml) или вы также удалили его из списка экспортируемых функций в «DriverCA.CA». dll' (например, удалив атрибут '[CustomAction]')? Я спрашиваю из-за [WiX вопрос 4502] (http://wixtoolset.org/issues/4502); для более подробной информации смотрите [этот ответ SO] (http://stackoverflow.com/a/25299512/2300713). Если вы вначале пропустили некоторые из ваших центров сертификации для простоты и теперь решили проблему, переместив некоторый код в другую CA-dll, это может быть так. – Hille

+0

Да, я удалил атрибут '[CustomAction]' и весь этот метод. – benderto