У меня проблема с пользовательскими действиями в моем проекте. Некоторые работают, некоторые нет. У меня есть два проекта С# CustomAction Project и Setup Project в VS 2012. Мои пользовательские действия выглядят так. Два первых действия не вызывают проблемы. Не работает только третий.
[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;
}
Я определяю пользовательские действия следующим образом:
<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 или что-то в этом роде.
ОБНОВЛЕНИЕ: цель пользовательского действия — проверить, запущены ли какие-либо процессы, и в соответствии с этим прервать процесс удаления. Настройка выполняется для каждой системы, и у меня не было проблем с окнами сообщений в любых других настраиваемых действиях. Я решил это с другим проектом настраиваемого действия, в котором само по себе есть настраиваемое действие с проблемой, но в остальном я использую точно такие же методы и определения настройки (конечно, исключая другое определение dll). Все еще не знаю, в чем проблема.