我們在一個項目中有同樣的問題我正在努力,但我們採取了不同的方法。我們不是使用必須與可執行文件位於同一路徑中的App.config文件,而是更改了安裝程序類和服務的Main入口點。
我們這樣做是因爲我們不希望在不同位置使用相同的項目文件。這個想法是使用相同的分發文件,但使用不同的服務名稱。
所以我們所做的就是我們的ProjectInstaller內:
private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
string keyPath = @"SYSTEM\CurrentControlSet\Services\" + this.serviceInstaller1.ServiceName;
RegistryKey ckey = Registry.LocalMachine.OpenSubKey(keyPath, true);
// Pass the service name as a parameter to the service executable
if (ckey != null && ckey.GetValue("ImagePath")!= null)
ckey.SetValue("ImagePath", (string)ckey.GetValue("ImagePath") + " " + this.serviceInstaller1.ServiceName);
}
private void ProjectInstaller_BeforeInstall(object sender, InstallEventArgs e)
{
// Configura ServiceName e DisplayName
if (!String.IsNullOrEmpty(this.Context.Parameters["ServiceName"]))
{
this.serviceInstaller1.ServiceName = this.Context.Parameters["ServiceName"];
this.serviceInstaller1.DisplayName = this.Context.Parameters["ServiceName"];
}
}
private void ProjectInstaller_BeforeUninstall(object sender, InstallEventArgs e)
{
if (!String.IsNullOrEmpty(this.Context.Parameters["ServiceName"]))
this.serviceInstaller1.ServiceName = this.Context.Parameters["ServiceName"];
}
我們使用InstallUtil來安設我們這樣的服務:
[FramerokPath]\installutil /ServiceName=[name] [ExeServicePath]
然後,你的應用程序的Main
切入點內,我們檢查了args
屬性以獲取我們在AfterInstall事件中設置的服務的安裝名稱。
這種方法有一些問題,如:
- 我們不得不爲沒有參數安裝服務創建一個默認名稱。例如,如果沒有名稱傳遞給我們的服務,那麼我們使用默認的名稱;
- 您可以將傳遞給我們的應用程序的服務名稱更改爲與安裝的名稱不同。
本頁面的解決方案對我來說並不完全適用。我可以得到正確的目錄,但在調用SetCurrentDirectory之後,配置值仍然只是空字符串。你有沒有做別的事情導致.config文件被加載後? – Sean 2013-07-15 18:58:50