【问题标题】:Referencing Projects from Windows Service从 Windows 服务引用项目
【发布时间】:2026-01-14 03:40:03
【问题描述】:

我正在尝试使用 C# 和 .NET 框架编写我的第一个 Windows 服务,但无法在服务内的同一解决方案中引用项目。我在 VS2012 中的 MVC 解决方案结构:

  1. 1 个 MVC 项目(网络应用项目)
  2. 1 个附加处理项目(用于控制器内的扩展处理)
  3. 1个服务项目
  4. 1安装shield le项目(成功安装服务项目)

在我的服务中(我想每 x 分钟触发一次)我在扩展处理项目中引用方法,当我在服务项目中编写代码时,intellisense 能够检测到这些方法(我有一个 using extendedProcessingProject; using webAppProject;以及对 extendedProcessingProject 和 web 应用程序项目的项目引用)。

该服务安装到我的本地电脑没有错误。当我启动服务时,我记录了一个我似乎无法弄清楚的错误:

Exception body: ReminderEmailService Object reference not set to an instance of an     object.  System.Collections.ListDictionaryInternal  
 System.NullReferenceException: Object reference not set to an instance of an object.
   at ReminderEmailService.ReminderEmailService.ReminderEmails(Object source, ElapsedEventArgs e)

   at ReminderEmailService.ReminderEmailService.SendReminderEmails(Object source, ElapsedEventArgs e)

无效的 SendReminderEmails(System.Object, System.Timers.ElapsedEventArgs)

我知道使用System.Diagnostics.Debugger.Launch(); 可以看到

List<SessionReminder> sessions = Queries.GetSessionsToRemind();                    
//sessions does not have a value, method returns a list of 1
//I suspect this is a project reference issue
debugString += "sessions: \n" + sessions.ToString(); 
//exception thrown on this line--I suspect because sessions is null

我在我的解决方案中的所有项目上都使用 .NET4.0(不是客户端配置文件)。任何有关如何使我的 Windows 服务能够正确访问这些程序集(webappproject.dll 和 extendedProcessing.dll)的见解将不胜感激,因为这些 dll 是由 install shield 安装的。

【问题讨论】:

    标签: c# .net asp.net-mvc visual-studio-2012 windows-services


    【解决方案1】:

    这可能不是实际的程序集参考问题。您看到的错误是运行时抱怨访问空对象的方法/字段/属性。这表明您的代码正在访问一个未初始化的对象。

    【讨论】:

      【解决方案2】:

      您显示的异常看起来不像是引用程序集的问题。它看起来像代码中的普通错误,而不是缺少的程序集。

      我总是为 Windows 服务创建一个测试工具,使我能够将服务作为一个简单的 Windows 窗体应用程序运行,从而使调试变得容易。

      将您的服务实现与具有实际 Windows 服务的程序集分离为一个单独的程序集。使用简单的开始/停止按钮创建另一个项目 WPF/Winforms。从 Windows 服务和 winforms 应用程序引用包含在您的服务中运行的功能的程序集。

      【讨论】:

      • 我已将服务正在执行的方法放在单独的程序集中;但是,我收到了相同的结果。同样,智能感知可以在我创建的单独程序集中访问服务内处理所需的所有方法。然而; Queries.GetSessionsToRemind(); 没有在服务中返回结果(我已经在我的 web 应用程序项目的控制器中单独测试了这个方法,这应该等同于你建议的单独的 WPF/Winform 项目并且它按预期工作)。再次感谢您在此问题上的帮助。
      • 所以您无法在您的 Web 应用程序中复制您在 Windows 服务中遇到的问题?
      • 我建议在应用程序的配置或其中正在运行的上下文方面存在一些不同。我建议您使用 Windows 应用程序而不是 Web 应用程序来测试您的代码,因为 Web 应用程序的上下文和您的服务之间的差异将远远大于 Windows 服务和 Windows 窗体应用程序之间的差异。例如应用程序有 HttpContext。您可能还想考虑安全上下文。
      • 通常我在 Windows 服务上创建一个 app.config。然后转到 winforms 项目并使用 Visual Studio 中的“添加为链接”功能将相同的 app.config 添加到 Windows 应用程序,以便两个应用程序使用相同的物理文件进行配置
      • 我找到了解决方案。我最终将我的服务实现分离到另一个项目(“助手”项目)中。在这个“助手”中,我通过 EF 访问我的数据库。为了做到这一点,我必须添加一个 app.config 文件(与我的模型的连接字符串,在与 .edmx 文件相同的项目中找到)。从那里我可以访问我的数据库,并避免我收到@Nate Burkett 建议的原始错误。
      最近更新 更多