2017-09-13 151 views
0

我有一個Window服務,正在我的機器上運行。我在執行某些功能的相同解決方案中有單獨的控制檯應用程序。爲了訪問控制檯應用程序的功能,我添加了控制檯應用程序的* .exe文件作爲對Window Service項目的引用。通過窗口服務調用控制檯應用程序

public void OnTimer(object sender, System.Timers.ElapsedEventArgs args) 
{ 
    // TODO: Insert monitoring activities here. 
    EventLog.WriteEntry("Monitoring the System", EventLogEntryType.Information); 
    string[] arr = new string[] { }; 
    ConsoleApplication.Program.Main(null); 
} 

如果我直接通過Visual Studio運行,控制檯應用程序完美工作。但是,如果我從窗口服務調用Main()方法,我得到一個空指針異常。

public static void Main(string[] args) 
{ 
    try 
    { 
     //CODE BREAKS HERE ON READING FROM CONFIG FILE 
     string genesis_sel= ConfigurationSettings.AppSettings["genesis_sel"].ToString(); 
    } 
    catch (Exception ex) 
    { 
     //Exception code 
    } 
} 

下面是在Visual Studio中運行的控制檯應用程序項目的快照。

enter image description here

我不知道是什麼導致,而從一個窗口服務訪問的主要方法的代碼打破。

有什麼建議嗎?

更新:增加了配置文件的快照。我不相信這是來自配置文件的rad訪問問題,因爲當我單獨運行控制檯應用程序時,它正在正確讀取。當我通過窗口服務訪問它時有一個初始化問題。

enter image description here

UPDATE替換爲一個事件日誌的主要方法,但仍然得到同樣的異常。 enter image description here

+0

貌似配置鍵,'genesis_sel'及其價值在您的Windows服務的應用程序設置中缺少。 – ashin

+0

你可以分享你的配置文件嗎? – aaronR

+0

@ashin不,我不這麼認爲 –

回答

1

當您調用該方法時,它將作爲服務的一部分運行,因此它使用服務中的環境和設置。這意味着您應該在服務項目的AppSettings中有正確的數據。爲了更清晰:在這種情況下,功能Main是您的service的一部分,而不是單獨的應用程序根目錄。

否則,您可以將控制檯作爲單獨的進程運行,但在這種情況下,您將失去部分控制功能。

我建議,在它從一個單獨的項目/ DLL功能和通話功能獨立共同的邏輯,它會更乾淨,而不是如此混亂

+0

我用事件日誌替換了配置代碼,但是在運行Window Service時拋出相同的錯誤 –

+0

同樣的錯誤? – ASpirin

+0

「空例外」。我認爲它需要初始化。不知何故,當通過Window Service調用時,這些值不會被初始化,並且當作爲控制檯應用程序運行時,它們是。你的想法 ? –

相關問題