Служба не может видеть переменную среды - PullRequest
1 голос
/ 01 октября 2009

Я создал установщик (через WiX), который в рамках установки устанавливает службу Windows (написанную на C #) и запускает эту службу Windows. Служба представляет собой FileSystemWatcher и следит за установкой плагинов в конкретный каталог. Первоначально он использовал переменную среды (которая указывала на путь, который я хотел просмотреть), который был создан установщиком WiX, но он был создан в отдельном каталоге, как показано ниже:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="AppFolder" Name="MyApp">
            <Component Id="WatcherService" Guid="[MY GUI ID]">
                <File Id="WatcherEXE" Name="watcher.exe" DiskId="1" Source="../Watcher/bin/Release/Watcher.exe" KeyPath="yes" />
                <ServiceInstall Id="Watcher" Name="PlugInWatcher" DisplayName="Plug-in Watcher" Type="ownProcess" Start="auto" 
                              ErrorControl="normal" Description="Monitors the plug-in folder for new and deleted plug-ins." Account="[SERVICEACCOUNT]" Password="[SERVICEPASSWORD]" />
                <ServiceControl Id="StartWatcherService" Name="PlugInWatcher" Start="install" Wait="no" />
                <ServiceControl Id="StopWatcherService" Name="PlugInWatcher" Stop="both" Wait="yes" Remove="uninstall" />
            </Component>
        </Directory>
    </Directory>

    <Directory Id="CommonAppDataFolder" Name="CommonAppData">
        <Directory Id="MyAppData" Name="MyAppData">
            <Directory Id="PluginAppData" Name="Plugins">
                <Component Id="PluginDir" Guid="[MY GUI ID]">
                    <CreateFolder Directory="PluginAppData" />
                    <RemoveFolder Id="PluginDir" On="uninstall" />
                    <Environment Id="PluginVar" Name="PLUGIN_DIR" Action="set" Permanent="no" System="yes" Value="[PluginAppData]" />
                </Component>
            </Directory>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
</Directory>

Теперь я делаю почти то же самое, но переменная окружения теперь создается в том же каталоге (KeyPath?), Как здесь:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="AppFolder" Name="MyApp">
            <Component Id="PluginDir" Guid="[MY GUI ID]" KeyPath="yes">
              <Environment Id="PluginVar" Name="PLUGIN_DIR" Action="set" Permanent="no" System="yes" Value="[MyApp]" />
            </Component>

            <Component Id="WatcherService" Guid="[MY GUI ID]">
                <File Id="WatcherEXE" Name="watcher.exe" DiskId="1" Source="../Watcher/bin/Release/Watcher.exe" KeyPath="yes" />
                <ServiceInstall Id="Watcher" Name="PlugInWatcher" DisplayName="Plug-in Watcher" Type="ownProcess" Start="auto" 
                              ErrorControl="normal" Description="Monitors the plug-in folder for new and deleted plug-ins." Account="[SERVICEACCOUNT]" Password="[SERVICEPASSWORD]" />
                <ServiceControl Id="StartWatcherService" Name="PlugInWatcher" Start="install" Wait="no" />
                <ServiceControl Id="StopWatcherService" Name="PlugInWatcher" Stop="both" Wait="yes" Remove="uninstall" />
            </Component>
        </Directory>
    </Directory>
</Directory

Проблема в том, что при первом способе служба работала нормально. Он запустится, найдет путь, связанный с переменной среды, и проконтролирует каталог. Однако со вторым способом это больше не происходит. Служба НИКОГДА не видит переменную среды. Переменная создана, служба запущена, но она никогда не видит ее ... даже если я перезагружаюсь и т. Д. Это действительно озадачивающая проблема, потому что она не имеет смысла.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2009

Чтобы ответить на мой собственный вопрос, похоже, что установщик потребовал перезапустить систему, чтобы увидеть изменения в переменных среды. Это после того, как я попытался остановить и запустить службу среди прочего. Я не уверен, почему это так, потому что раньше он работал (без перезапуска системы).

0 голосов
/ 09 октября 2009

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

...