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