Закройте приложение 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 закрыть приложение перед удалением - закрыть сообщение открыть приложения

Другие вопросы по тегам