我很确定使用InstallUtil.exe安装时,Windows服务会将C:\ winnt(或类似)作为其工作目录。有没有办法可以访问或以其他方式捕获(在安装时)最初安装服务的目录?目前我手动将其输入到app.exe.config文件中,但这是非常可靠的手册,感觉就像是黑客。
在运行时或安装时间是否有编程方式来确定服务的安装位置?
答案 0 :(得分:34)
您可以使用反射来获取正在执行的程序集的位置。这是一个简单的例程,它使用反射将工作目录设置为正在执行的程序集的位置:
String path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = System.IO.Path.GetDirectoryName(path);
Directory.SetCurrentDirectory(path);
答案 1 :(得分:7)
你的意思是你想要包含程序集的目录吗?如果是这样,那很简单:使用Assembly.Location
。
我不会尝试更改过程的工作目录 - 如果这有令人讨厌的副作用,我不会感到惊讶,如果确实你被允许这样做。
答案 2 :(得分:5)
我不知道Directory.SetCurrentDirectory
方法。通常我会这样做:
Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
答案 3 :(得分:3)
虽然很晚,但它可能对某人有所帮助。我通过使用AppDomain.CurrentDomain.BaseDirectory
解决了这个问题string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml";
AppDomain.CurrentDomain.BaseDirectory给出了实际安装Windows服务的目录,而不是C:\ Windows \ system32 \ path。
我后来看到@Ramon已经发布了相同的解决方案。
答案 4 :(得分:2)
InstallUtil.exe
在安装时调用您应用程序的ServiceInstaller.Install()
。
覆盖它,将其添加到项目的Installers
列表中,并获取所需的任何信息。