我相信使用InstallUtil.exe安装的Windows服务,其工作目录为C:\winnt(或类似)。是否有任何方法可以在安装时访问或捕获服务最初安装的目录?目前,我正在手动将其输入到app.exe.config文件中,但那是非常手动且感觉像是一种hack。
是否有编程方式,在运行时或安装时确定服务的安装位置?
我相信使用InstallUtil.exe安装的Windows服务,其工作目录为C:\winnt(或类似)。是否有任何方法可以在安装时访问或捕获服务最初安装的目录?目前,我正在手动将其输入到app.exe.config文件中,但那是非常手动且感觉像是一种hack。
是否有编程方式,在运行时或安装时确定服务的安装位置?
您可以使用反射来获取正在执行的程序集的位置。这是一个简单的例程,使用反射将工作目录设置为执行程序集的位置:
String path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = System.IO.Path.GetDirectoryName(path);
Directory.SetCurrentDirectory(path);
您是指需要包含程序集的目录吗?如果是,那很容易:使用Assembly.Location
。
我不会尝试更改进程的工作目录 - 如果确实允许这样做,我不会感到惊讶,因为这可能会产生不良影响。
我之前不知道Directory.SetCurrentDirectory
方法,通常我会这样做:
Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml";
AppDomain.CurrentDomain.BaseDirectory可以提供Windows服务实际安装的目录,而不是C:\Windows\system32\路径。
后来我看到@Ramon已经发布了相同的解决方案。
InstallUtil.exe
在安装时调用您的应用程序的 ServiceInstaller.Install()
方法。
覆盖它,将其添加到项目的 Installers
列表中,并获取所需的任何信息。
C:\Windows\system32
吗? - ProfKC:\Windows\system32
中的 app.config,并且认为它的位置就在那里。 - ProfK