如何使用 C# 找到 Windows 服务的安装目录?
Posted
技术标签:
【中文标题】如何使用 C# 找到 Windows 服务的安装目录?【英文标题】:How do I find the install directory of a Windows Service, using C#? 【发布时间】:2010-10-04 06:04:16 【问题描述】:我很确定 Windows 服务在使用 InstallUtil.exe 安装时会将 C:\winnt(或类似的)作为其工作目录。有什么方法可以访问或捕获(在安装时)最初安装服务的目录?目前我手动将其输入到 app.exe.config 文件中,但这是非常可怕的手动操作,感觉就像是 hack。
是否有一种编程方式(在运行时或安装时)来确定服务的安装位置?
【问题讨论】:
【参考方案1】:您可以使用反射来获取正在执行的程序集的位置。这是一个简单的例程,它使用反射将工作目录设置为执行程序集的位置:
String path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = System.IO.Path.GetDirectoryName(path);
Directory.SetCurrentDirectory(path);
【讨论】:
这不是给C:\Windows\system32
吗?
@ProfK,不,它给出了执行程序集的位置。这将是正在运行的程序的实际可执行文件的目录。
我的错。我发现我的服务在 C:\Windows\system32
中寻找 app.config,并假设它认为它的位置在那里。【参考方案2】:
你的意思是你想要包含程序集的目录吗?如果是这样,那很简单:使用Assembly.Location
。
我不会尝试更改该进程的工作目录 - 如果这会产生令人讨厌的副作用,我不会感到惊讶,如果你确实被允许这样做的话。
【讨论】:
谢谢,乔恩。你是对的,这个问题的措辞不太正确,所以我已经改变了。 所以,乔恩,这是否已经确认,一旦服务安装和/或运行,就不想更改服务的工作文件夹,或者有没有办法在服务期间设置工作文件夹安装,以便您能够使用相对路径而不是绝对路径访问文件/文件夹?我在我的服务中看到了同样的情况,它几乎是作为用于测试/调试的 exe 编写的,然后定义一个符号并编译将其编译为服务,但它总是用完 %SYSTEMROOT%\System32.. . @LarryF:我不知道有什么方法可以更改用于服务的工作目录,不。这并不意味着没有办法这样做,但我不知道有一个。【参考方案3】:我不知道Directory.SetCurrentDirectory
方法。通常我会这样做:
Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
【讨论】:
【参考方案4】:虽然很晚,但它可能对某人有所帮助。我通过使用 AppDomain.CurrentDomain.BaseDirectory 解决了这个问题
string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml";
AppDomain.CurrentDomain.BaseDirectory 给出了实际安装 Windows 服务的目录,而不是 C:\Windows\system32\ 路径。
后来我看到@Ramon 已经发布了相同的解决方案。
【讨论】:
【参考方案5】:InstallUtil.exe
在安装时调用您的应用程序的ServiceInstaller.Install()
。
覆盖它,将其添加到您项目的Installers
列表中并获取您需要的任何信息。
【讨论】:
谢谢。 Jon 和 Steve 的运行时方法实际上更适合我需要做的事情。以上是关于如何使用 C# 找到 Windows 服务的安装目录?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?