如何为Windows服务设置“开始”路径

时间:2011-07-01 06:35:08

标签: c# windows-services

我有以下类,Windows Installer项目使用它来安装服务:

[RunInstaller(true)]
public sealed class Installer : System.Configuration.Install.Installer
{
    private readonly string _installDir;

    public Installer()
    {
        var locatedAssembly = this.GetType().Assembly.Location;
        this._installDir = Path.GetDirectoryName(locatedAssembly);
        var serviceProcessInstaller = new ServiceProcessInstaller
        {
            Account = ServiceAccount.LocalSystem
        };

        var serviceInstaller = new ServiceInstaller
        {
            ServiceName = Settings.Service.Name,
            StartType = ServiceStartMode.Automatic
        };

        this.Installers.Add(serviceProcessInstaller);
        this.Installers.Add(serviceInstaller);
        this.Context = new InstallContext(this._installDir + @"\install.log", new[]
        {
            string.Format("/assemlypath={0}", locatedAssembly)
        });
    }

    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        var serviceController = new ServiceController(Settings.Service.Name);
        serviceController.Start();
        serviceController.WaitForStatus(ServiceControllerStatus.Running);
    }
}

如果我们在控制台应用程序中调用以下代码,则将采用程序集的目录:

using (var stream = File.Open("foo.store", FileMode.OpenOrCreate))

如果我从Windows服务中运行该行,则会取代C:\Windows\System32\

如何更改此行为?

澄清:我不想利用任何程序集间谍(从this.GetType()获取程序集的路径......)或appsettings中的任何内容。我希望它在呼叫者方面没有任何魔法直接工作:)

2 个答案:

答案 0 :(得分:2)

不要信任当前目录。如果文件位于服务使用之外:

string sdir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

恢复可执行文件所在的路径,并将其用作查找文件的基本路径。

答案 1 :(得分:1)

您需要从配置文件或注册表中读取文件夹位置。没有类似的起始目录。