服务不能看环境变量

时间:2009-10-01 16:07:02

标签: windows installer wix environment-variables

我创建了一个安装程序(通过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 :(得分:0)

这可能是一个愚蠢的想法,但您是否尝试过移动组件? 我在你的第一篇文章中看到你首先拥有创建服务的组件,然后是具有env变量的组件。 事情应该以相同的顺序发生,无论如何,否则我看不出你的代码有什么问题

答案 1 :(得分:0)

要回答我自己的问题,安装程序似乎需要重新启动系统才能查看环境变量的更改。这是在我尝试停止并启动服务之后。我不确定为什么这是因为它之前正在工作(没有重新启动系统)。