Я знаю, что подобные вопросы задавались в прошлом, но мне до сих пор не удалось найти решение моей проблемы.
У меня есть запущенное приложение в системном трее, и я хочу закрыть его до того, как начнется удаление и отобразится диалоговое окно «FileInUse», но все, что я делаю, не работает. Чтобы закрыть приложение в системном трее, мне нужно создать файл в папке, где оно установлено. Затем приложение удаляет файл и закрывается.
Я получаю следующие проблемы в зависимости от того, что я пробовал:
1) Отображается диалоговое окно «FileInUse». Не хорошо
2) Не удалось вызвать мое пользовательское действие, которое создает файл для уведомления моего приложения на панели задач о том, что оно должно быть закрыто.
Error 1 ICE77: CloseAgentMonitor is a in-script custom action. It must be
sequenced in between the InstallInitialize action and the InstallFinalize action in
the InstallExecuteSequence table
3) Не удается передать папку моего приложения в качестве параметра CustomData в CustomAction
, если я установил для него значение Immediate
вместо Immediate
, но если я установил для него значение Deferred
, я получаю сообщение об ошибке, упомянутое в 2)
4) Я пробовал разные сценарии от вызова пользовательского действия до RemoveFiles
, InstallValidate
, InstallFinalize
.
Поскольку я не уверен, каковы правильные последовательности, может кто-нибудь сказать мне, как и когда вызывать мой CustomAction, чтобы он срабатывал, когда кнопка «Удалить» была закрыта или до того, как файлы начали удаляться.
Я хочу сделать это при удалении файлов и до отображения диалогового окна FileInUse
.
Обратите внимание, что очень важно, чтобы я мог справиться с этим как в автоматическом, так и в визуальном удалении.
Спасибо.
ОБНОВЛЕНИЕ:
Я, вероятно, должен был опубликовать свой код wix:
<!-- Set variables required by the CloseAgentMonitor CustomAction -->
<CustomAction Id="CloseAgentMonitorSetProp"
Return="check"
Property="CloseAgentMonitor"
Execute="immediate"
Value="APPLICATIONFOLDER=[APPLICATIONFOLDER]" />
<!-- Define CustomAction to close the Agent on uninstall -->
<CustomAction Id="CloseAgentMonitor"
Return="check"
Execute="immediate"
BinaryKey="CustomActions.CA"
DllEntry="CloseAgentMonitor" />
<InstallExecuteSequence>
<!- Make sure to set the props before the CloseAgentMonitor custom action -->
<Custom Action="CloseAgentMonitorSetProp" Before="CloseAgentMonitor">
<![CDATA[(Installed AND NOT UPGRADINGPRODUCTCODE)]]>
</Custom>
<Custom Action="CloseAgentMonitor" Before="InstallValidate">
<![CDATA[(Installed AND NOT UPGRADINGPRODUCTCODE)]]>
</Custom>
...
Изменение CustomAction
на немедленное и установка его для вызова до InstallValidate
решает проблему, упомянутую в пункте 2, но возвращает ошибку, упомянутую в пункте 3, где кажется, что мой CustomActionData
не устанавливается, даже если он должен быть установлен, поскольку он вызывается перед CustomAction
.
Вы можете ясно видеть из моих журналов, что это:
MSI (s) (30:08) [16:22:47:148]: Doing action: CloseAgentMonitorSetProp
MSI (s) (30:08) [16:22:47:148]: Note: 1: 2205 2: 3: ActionText
Action 16:22:47: CloseAgentMonitorSetProp.
Action start 16:22:47: CloseAgentMonitorSetProp.
MSI (s) (30:08) [16:22:47:148]: PROPERTY CHANGE: Adding CloseAgentMonitor property.
Its value is 'APPLICATIONFOLDER=C:\Program Files (x86)\Company\Client\'.
Action ended 16:22:47: CloseAgentMonitorSetProp. Return value 1.
Но, как вы видите, когда вызывается мой CustomAction
, возникает ошибка при попытке доступа к APPLICATIONFOLDER
.
MSI (s) (30:08) [16:22:47:148]: Doing action: CloseAgentMonitor
MSI (s) (30:08) [16:22:47:148]: Note: 1: 2205 2: 3: ActionText
Action 16:22:47: CloseAgentMonitor.
Action start 16:22:47: CloseAgentMonitor.
MSI (s) (30:1C) [16:22:47:148]: Invoking remote custom action. DLL:
C:\Windows\Installer\MSI57B2.tmp, Entrypoint: CloseAgentMonitor
MSI (s) (30:C0) [16:22:47:148]: Generating random cookie.
MSI (s) (30:C0) [16:22:47:148]: Created Custom Action Server with PID 2528 (0x9E0).
MSI (s) (30:F4) [16:22:47:195]: Running as a service.
MSI (s) (30:F4) [16:22:47:195]: Hello, I'm your 32bit Impersonated custom action server.
SFXCA: Extracting custom action to temporary directory: C:\Windows\Installer\MSI57B2.tmp-\
SFXCA: Binding to CLR version v4.0.30319
Calling custom action CustomActions!CustomActions.CustomActions.CloseAgentMonitor
CloseAgentMonitor - Start
IsAgentMonitorRunning - Start
Checking if Agent Monitor is running.
Agent Monitor running: True
IsAgentMonitorRunning - End
Checking CustomActionData - Start
Checking CustomActionData - End
Exception thrown by custom action:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of
an invocation. ---> System.Collections.Generic.KeyNotFoundException: The given key was
not present in the dictionary. at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at Microsoft.Deployment.WindowsInstaller.CustomActionData.get_Item(String key)
at CustomActions.CustomActions.CloseAgentMonitor(Session session)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object arguments, Signature sig,
Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object parameters,
Object arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder
binder, Object parameters, CultureInfo culture)
at Microsoft.Deployment.WindowsInstaller.CustomActionProxy.InvokeCustomAction(Int32
sessionHandle, String entryPoint, IntPtr remotingDelegatePtr)
CustomAction CloseAgentMonitor returned actual error code 1603 (note this may not be 100%
accurate if translation happened inside sandbox)
Action ended 16:22:47: CloseAgentMonitor. Return value 3.
Action ended 16:22:47: INSTALL. Return value 3.