如何使用 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 服务?

如何检查是不是在 C# 中安装了 Windows 服务

C#创建安装一个Windows服务

如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?

如何将我自己的 XML 配置文件添加到 Windows 服务 C#

windows服务器上,如何迁移tomcat 目录