我有以下类,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中的任何内容。我希望它在呼叫者方面没有任何魔法直接工作:)
答案 0 :(得分:2)
不要信任当前目录。如果文件位于服务使用之外:
string sdir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
恢复可执行文件所在的路径,并将其用作查找文件的基本路径。
答案 1 :(得分:1)
您需要从配置文件或注册表中读取文件夹位置。没有类似的起始目录。