2017-09-13 258 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调用时,这些值不会被初始化,并且当作为控制台应用程序运行时,它们是。你的想法 ? –

相关问题