2009-01-29 84 views
19

我很确定Windows服务在使用InstallUtil.exe进行安装时获取C:\ winnt(或类似)作为其工作目录。有什么方法可以访问或以其他方式捕获(在安装时)服务最初安装的目录?目前我手动输入app.exe.config文件,但这是可怕的手动,感觉像一个黑客。如何使用C#找到Windows服务的安装目录?

有没有一种编程方式,无论是在运行时还是安装时间,以确定服务的安装位置?

回答

33

您可以使用反射来获取正在执行的程序集的位置。这里有一个简单的步骤,设置工作目录执行的程序集使用反射的位置:

String path = System.Reflection.Assembly.GetExecutingAssembly().Location; 
path = System.IO.Path.GetDirectoryName(path); 
Directory.SetCurrentDirectory(path); 
7

你的意思是你想要包含程序集的目录吗?如果是这样,那很简单:使用Assembly.Location

我不会尝试更改该过程的工作目录虽然 - 我不会感到惊讶,如果这有令人讨厌的副作用,如果确实允许你这样做。

+0

谢谢,乔恩。你是对的,这个问题的措辞不是很正确,所以我改变了它。 – endian 2009-01-29 14:49:20

+0

So Jon,这是否已经得到证实,一旦安装和/或运行,或者是否有办法在Service INSTALL期间设置工作文件夹,就不会想要更改服务的工作文件夹,以便您能够使用相对路径访问文件/文件夹,而不是绝对路径?我看到了与我的服务相同的东西,这些东西几乎是作为测试/调试的exe文件编写的,然后定义一个符号并编译将其编译为服务,但它总是用完%SYSTEMROOT%\ System32 .. – LarryF 2013-02-20 23:54:15

+0

@LarryF:我不知道有什么方法可以改变用于服务的工作目录,不。这并不意味着没有办法这样做,但我不知道一个。 – 2013-02-21 06:44:45

2

InstallUtil.exe在安装时调用ServiceInstaller.Install()应用程序。

覆盖它,将其添加到项目的Installers列表中,并获得您需要的任何信息。

5

我不知道Directory.SetCurrentDirectory方法。通常我会这样做:

Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory; 
3

虽然很晚,但它可以帮助某人。 \ Windows \ System32下\路径:我用AppDomain.CurrentDomain.BaseDirectory

string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml"; 

AppDomain.CurrentDomain.BaseDirectory了在窗口服务实际上isntalled,不是C目录解决了这个问题。

我后来看到@Ramon已经发布了相同的解决方案。