Nano Hash - криптовалюты, майнинг, программирование

Закройте приложение в системном трее перед удалением с помощью 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.

Ответы:


1

Я понял!!

Не могу поверить, что это было так просто! Провел часы, изучая его, когда все, что мне нужно было сделать, это изменить session.CustomActionData["APPLICATIONFOLDER"] на session["APPLICATIONFOLDER"].

Первоначально я начал использовать переменные сеанса, но столкнулся с различными проблемами, поэтому в итоге я использовал CustomActionData, но я только что проверил, и все мои пользовательские действия были отложены до сих пор.

Поэтому, если я правильно получаю Wix, вы должны использовать CustomActionData в отложенном CustomAction, и вы должны использовать переменные сеанса в немедленном CustomAction.

Итак, код в вашем пользовательском действии должен быть:

string applicationFolder = session["APPLICATIONFOLDER"];

вместо

string applicationFolder = session.CustomActionData["APPLICATIONFOLDER"];

Надеюсь, это поможет кому-то еще!

09.10.2014

2

Обнаружение используемых файлов выполняется действием InstallValidate, которое предшествует InstallInitialize. Предполагая, что ваш код работает нормально, запустите его как немедленное настраиваемое действие, и до InstallValidate должно быть все в порядке.

Зачем вам нужно создавать файл в той же папке? Похоже, это не связано с вашей проблемой с используемыми файлами. Обычный способ закрыть работающее приложение — отправить ему сообщение о закрытии. WiX имеет специальное действие CloseApp, которое сделает это.

И вот это, в котором говорится о похожих вещах:

Закрыть приложение WiX перед удалением - сообщение о закрытии открытых приложений

09.10.2014
  • Я попробую. Причина, по которой я создаю файл .exit, заключается в том, чтобы закрыть мое приложение, поскольку отправка сообщения WM_CLOSE не работает для меня, как и CloseApp. Я подумал, что это быстрый и простой обходной путь, который, кажется, работает довольно хорошо, поэтому я решил, что пойду с ним. В любом случае, я попробую ваше предложение и вернусь. Спасибо. 09.10.2014
  • Это боль, если приложение в трее плохо реагирует на закрытие, если код принадлежит вам или вашей компании, то его исправление может быть более быстрым и более дешевым, чем прыгать через обручи, чтобы заставить его работать. 09.10.2014
  • Я согласен, но это приложение в системном трее не используется многими клиентами и является необязательным, а приоритеты для него очень низкие. Я пытаюсь включить его, чтобы в конечном итоге он использовался чаще, но, к сожалению, это не изменит моих приоритетов. В конце концов я посмотрю на это и попытаюсь закрыть его с помощью соответствующего сообщения WM_CLOSE. 09.10.2014
  • Я только что обновил свой ответ. Как видите, проблема 2 исчезла, но затем возникает проблема 3, когда мои переменные не устанавливаются/не передаются в пользовательское действие. Если вы посмотрите в моем сценарии, у меня есть сообщение «Проверка CustomActionData - Start», и сразу после него есть Checking CustomActionData - End, но ничего между ними. Это содержит цикл, который должен выводить передаваемые переменные, но их нет, даже если CloseAgentMonitorSetProp настроен на вызов перед CustomAction. 09.10.2014
  • Вам нужно немедленное пользовательское действие, и они не используют CustomActionData. 09.10.2014
  • Есть ли способ передать переменную из моей настройки в пользовательское действие? Мне нужно передать ему переменную APPLICATIONFOLDER. 09.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..