Как я могу установить своего рода «Start in» -path для службы Windows - PullRequest
1 голос
/ 01 июля 2011

У меня есть следующий класс, который используется проектом установщика Windows для установки службы:

[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() ...) или что-либо в настройках приложения. Я хочу, чтобы это работало прямо без какой-либо магии на стороне вызывающего абонента:)

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Не доверяйте текущему каталогу.Если файл расположен помимо службы, используйте:

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

для восстановления пути, по которому находится исполняемый файл, и используйте его в качестве базового пути для поиска файла.

1 голос
/ 01 июля 2011

Вам нужно будет прочитать расположение папки из файла конфигурации или реестра.Аналогов стартового каталога нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...