如何查找Windows服务的.NET版本?

3
这里有很多关于如何查找已安装的.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
通过@Tim的回复,您应该看到您的app.config(exe.config)已更新以反映受支持的运行时中的适当.NET版本。但是,还有其他因素,这取决于您的代码是否实际上正在针对具有文件路径的特定文件和库(这是不好的,但可能会发生)。 - Jeff
再说一遍,伙计们,我知道这些。但是这是针对可执行文件的。我需要知道更改可执行文件是否会对服务使用的代码造成任何影响。 - GaidinD
我觉得你没有恰当地解释清楚你真正的问题。你是担心“重新启动”不会从内存中卸载可执行代码吗?服务是否会保留文件的缓存副本,而不使用你替换的文件?服务元数据是否记住了.NET版本,并尝试使用旧版本而不是新程序集所引用的版本?你是否确实见过加载错误的版本,还是只是为了做好应对麻烦的准备? - Ben Voigt
简单明了。假设有一个 Windows 服务,不考虑重新启动计算机或其他任何操作,你如何知道该服务使用的 .NET 版本?假设可执行文件经常变更,因此无法相信可执行文件的版本号。 - GaidinD
2个回答

4

所以我认为这就是答案。如果有人能够审核一下,我会很高兴。

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

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

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

编辑:

仅当使用InstallUtil.exe安装Windows服务时,才会存在此注册表项。如果使用SC.exe安装了Windows服务,则该注册表项将出现在以下位置:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\<your_service_name>


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

好的,为了明确起见,即使我更改了可执行文件,直到我在GAC上进行更改,它才不会反映在实际服务上的任何更改。 - GaidinD
这要看情况 - 但大多数情况下,您需要将您的dll注册到GAC中。如果它是一个服务 - 在服务中查找它所基于的dll,然后使用属性(右键单击)检查其版本 - 可能您会发现它仍然是2.0。 - Dan Kuida
如果服务不在GAC上怎么办?我使用gacutil在GAC上找不到我的服务。我是不是漏掉了什么?也许我引用的是错误的GAC。 - GaidinD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接