2009-01-29 52 views
19

我很確定Windows服務在使用InstallUtil.exe進行安裝時獲取C:\ winnt(或類似)作爲其工作目錄。有什麼方法可以訪問或以其他方式捕獲(在安裝時)服務最初安裝的目錄?目前我手動輸入app.exe.config文件,但這是可怕的手動,感覺像一個黑客。如何使用C#找到Windows服務的安裝目錄?

有沒有一種編程方式,無論是在運行時還是安裝時間,以確定服務的安裝位置?

回答

33

您可以使用反射來獲取正在執行的程序集的位置。這裏有一個簡單的步驟,設置工作目錄執行的程序集使用反射的位置:

String path = System.Reflection.Assembly.GetExecutingAssembly().Location; 
path = System.IO.Path.GetDirectoryName(path); 
Directory.SetCurrentDirectory(path); 
7

你的意思是你想要包含程序集的目錄嗎?如果是這樣,那很簡單:使用Assembly.Location

我不會嘗試更改該過程的工作目錄雖然 - 我不會感到驚訝,如果這有令人討厭的副作用,如果確實允許你這樣做。

+0

謝謝,喬恩。你是對的,這個問題的措辭不是很正確,所以我改變了它。 – endian 2009-01-29 14:49:20

+0

So Jon,這是否已經得到證實,一旦安裝和/或運行,或者是否有辦法在Service INSTALL期間設置工作文件夾,就不會想要更改服務的工作文件夾,以便您能夠使用相對路徑訪問文件/文件夾,而不是絕對路徑?我看到了與我的服務相同的東西,這些東西幾乎是作爲測試/調試的exe文件編寫的,然後定義一個符號並編譯將其編譯爲服務,但它總是用完%SYSTEMROOT%\ System32 .. – LarryF 2013-02-20 23:54:15

+0

@LarryF:我不知道有什麼方法可以改變用於服務的工作目錄,不。這並不意味着沒有辦法這樣做,但我不知道一個。 – 2013-02-21 06:44:45

2

InstallUtil.exe在安裝時調用ServiceInstaller.Install()應用程序。

覆蓋它,將其添加到項目的Installers列表中,並獲得您需要的任何信息。

5

我不知道Directory.SetCurrentDirectory方法。通常我會這樣做:

Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory; 
3

雖然很晚,但它可以幫助某人。 \ Windows \ System32下\路徑:我用AppDomain.CurrentDomain.BaseDirectory

string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml"; 

AppDomain.CurrentDomain.BaseDirectory了在窗口服務實際上isntalled,不是C目錄解決了這個問題。

我後來看到@Ramon已經發布了相同的解決方案。