【问题标题】:How do I find the install directory of a Windows Service, using C#?如何使用 C# 找到 Windows 服务的安装目录?
【发布时间】:2010-10-04 06:04:16
【问题描述】:

我很确定 Windows 服务在使用 InstallUtil.exe 安装时会将 C:\winnt(或类似的)作为其工作目录。有什么方法可以访问或捕获(在安装时)最初安装服务的目录?目前我手动将其输入到 app.exe.config 文件中,但这是非常可怕的手动操作,感觉就像是 hack。

是否有一种编程方式(在运行时或安装时)来确定服务的安装位置?

【问题讨论】:

    标签: c# windows windows-services


    【解决方案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 的运行时方法实际上更适合我需要做的事情。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 2023-03-27
        • 2016-10-11
        相关资源
        最近更新 更多