Закройте приложение systemtray перед удалением с помощью wix
Я знаю, что подобные вопросы задавались в прошлом, но мне до сих пор не удалось найти решение моей проблемы.
У меня есть приложение в системном трее, которое запущено, и я хочу закрыть его до начала удаления и отобразить диалоговое окно "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.
2 ответа
Я понял!!
Я не могу поверить, что это было так просто! Проведите часы, изучая это, когда все, что мне нужно было сделать, это изменить session.CustomActionData["APPLICATIONFOLDER"]
в session["APPLICATIONFOLDER"]
,
Первоначально я начал использовать переменные сеанса, но столкнулся с различными проблемами, поэтому в итоге я использовал CustomActionData
но я только что проверил, и все мои собственные действия были отложены до сих пор.
Так что, если я правильно получаю Wix, вы должны использовать CustomActionData
в отсрочке CustomAction
и вы должны использовать переменные сеанса в ближайшее время CustomAction
,
Поэтому код в вашем пользовательском действии должен быть:
string applicationFolder = session["APPLICATIONFOLDER"];
вместо
string applicationFolder = session.CustomActionData["APPLICATIONFOLDER"];
Надеюсь, это поможет кому-то еще!
Обнаружение используемых файлов выполняется действием InstallValidate, которое предшествует InstallInitialize. Предполагая, что ваш код работает нормально, запустите его как немедленное настраиваемое действие, и перед установкой InstallValidate все должно быть в порядке.
Зачем вам нужно создать файл в той же папке? Похоже, это не связано с вашей проблемой с файлами. Обычный метод закрытия запущенного приложения - отправить ему сообщение о закрытии. WiX имеет настраиваемое действие CloseApp, которое будет делать это.
И вот что говорит о похожих вещах:
WiX закрыть приложение перед удалением - закрыть сообщение открыть приложения