【问题标题】:How do you find out the .NET version of a Windows service?如何找出 Windows 服务的 .NET 版本?
【发布时间】:2016-02-01 22:03:54
【问题描述】:

这里有很多关于找出安装了什么 .NET 框架的问题。 我知道我已经安装了 .NET v4.6.1。

我想了解某个服务是基于哪个版本的 .NET 构建的。

假设我安装了 .NET v2.0 的服务 (XYZ.exe)。我对代码进行了更改并生成了另一个同名但使用 .NET v4.6.1 的可执行文件,并替换现有的可执行文件(在停止服务后)。当我重新启动服务时,该服务会使用新的可执行文件 (.NET v4.6.1) 还是有它使用的旧可执行文件 (.NET v2.0) 的预加载代码?

【问题讨论】:

  • 可执行文件将使用构建时目标框架的版本。所以如果你在 4.6.1 中构建它,那就是它的版本。
  • 通过@Tim 的响应 - 您应该会看到您的 app.config (exe.config) 已更新,以反映支持的运行时中的适当 .NET 版本。还有其他因素取决于您的代码是否实际上针对具有文件路径的特定文件和库(禁止,但可能)。
  • 再一次,伙计们,我知道这一切。但这是针对可执行文件的。我需要知道更改可执行文件是否会对服务使用的代码产生任何更改。
  • 我认为您没有正确解释您的真正问题。您是否担心“重启”不会从内存中卸载可执行代码?该服务保留文件的缓存副本并且不会使用您替换的文件?服务元数据会记住 .NET 版本并尝试使用旧版本而不是新程序集引用的版本?您是否真的看到加载了错误的版本,或者您正试图为麻烦做准备?
  • 简单明了。给定任何 Windows 服务,而不考虑重新启动计算机或其他任何东西,您如何知道该服务使用哪个版本的 .NET?假设可执行文件定期更改,因此您不能信任可执行文件的版本。

标签: c# .net windows c#-4.0 service


【解决方案1】:

所以我认为这就是答案。如果有人评论它,我会很高兴。

我们可以进入注册表到这个级别:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\eventlog\Application\<your_service_name>

然后,我们查看键 EventMessageFile 的值,它会显示已安装服务的 .NET 版本。

编辑:

仅当使用InstallUtil.exe 安装 Windows 服务时,才会出现此注册表项。但是,如果 Windows 服务是使用 SC.exe 安装的,那么注册表项将出现在:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\<your_service_name>

【讨论】:

    【解决方案2】:

    右键单击相关的 DLL 并在属性中找到其版本。 此外,如果您正在开发 - 请注意 DLL 可能会从 GAC 加载,而不是从您的 DLL

    【讨论】:

    • 好吧,为了清楚起见,即使我更改了可执行文件,在我对 GAC 进行更改之前,它也不会反映实际服务的任何更改。
    • 这取决于 - 但大多数情况下是的,您需要将您的 dll 注册到 GAC。如果它是一项服务 - 在服务中查找它所基于的 dll,然后使用属性检查其版本(右键单击) - 可能你会发现它仍然是 2.0
    • 如果服务不在 GAC 上怎么办?我无法使用 gacutil 在 GAC 的任何地方找到我的服务。我错过了什么吗?也许我指的是错误的 GAC。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多