我创建了一个安装程序(通过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
问题是,使用第一种方法,服务运行良好。它将启动,找到与环境变量关联的路径,并监视目录。然而,第二种方法不再发生。服务永远不会看到环境变量。变量被创建,服务启动,但它永远不会看到它......即使我重新启动等等。这是一个非常令人困惑的问题因为并且没有任何意义。
有什么建议吗?
答案 0 :(得分:0)
这可能是一个愚蠢的想法,但您是否尝试过移动组件? 我在你的第一篇文章中看到你首先拥有创建服务的组件,然后是具有env变量的组件。 事情应该以相同的顺序发生,无论如何,否则我看不出你的代码有什么问题
答案 1 :(得分:0)
要回答我自己的问题,安装程序似乎需要重新启动系统才能查看环境变量的更改。这是在我尝试停止并启动服务之后。我不确定为什么这是因为它之前正在工作(没有重新启动系统)。