为什么我的64位服务运行为32位?

6

我有一个 Windows 服务,它出现了这个问题。

  • 在 Visual Studio 中,我已将其平台目标设置为 64 位。
  • 我运行了 CorFlags 来验证它是否正确设置,我得到了这个结果:
Version   : v4.0.30319
CLR Header: 2.5  
PE        : PE32+
CorFlags  : 0x1    
ILONLY    : 1       
32BITREQ  : 0        
32BITPREF : 0        
Signed    : 0

我甚至尝试使用32BITREQ-32BITPREF-标志运行Corflags以确保它被设置为应该是的东西,但是没有成功。在任务管理器中,它显示为:

MyServiceName(32位)

服务是使用Topshelf 3.0安装的,在Windows Server 2012 R2 Standard上运行。这里发生了什么?


这是一个64位的盒子吗? ;) - 500 - Internal Server Error
@ 500 - 内部服务器错误 - 哈哈,是的,幸运的是我没有犯那个错误。 - snappymcsnap
你是否引用了任何32位的库?在.csproj文件中,你是否将Prefer32Bit设置为true? - Allan Elder
@Allan Elder 我已经仔细检查了库,它们都是“语言中立”的。我也没有勾选那个标志。 - snappymcsnap
1
@Shiv 一个32位应用程序可以毫无问题地生成一个64位进程。我有一种感觉,启动的进程实际上是TopShelf,它可能在32位下运行,并且是启动64位进程的那个。值得看看一些比任务管理器更好的进程查看器(例如Process Explorer),看看是否有你的exe被32位“任务”启动。 - Jcl
显示剩余2条评论
2个回答

2

我曾经遇到一个问题,当时服务的之前版本是32位的。我知道当前安装的版本不是32位的(通过CORFLAGS检查),但与服务相关联的进程仍然以32位方式创建,而我无法确定原因。

重启后问题消失了。我想知道服务控制管理器是否会“记住”每个服务的位数,作为启动优化(或其他什么东西)。


0

也许您的安装工具正在使用32位 installutil 安装进程?如我从 this article 理解的那样。

使用32位的 installutil 会导致在64位操作系统上强制执行可执行文件为32位。

特别是文章的这一部分似乎是这样说的:

为了解决这个问题,请在合适的Framework/Framework64目录之外运行installutil.exe。如果您构建了专门用于 ILONLY(ILONLY表示可执行文件包含纯IL代码,可以作为32位或64位进程运行)的插件,但想要将其注册到 wow64 hive 下,请使用位于 %windir%\microsoft.net\framework\v2.n.n.n 目录中的 installutil.exe。对于64位hive注册,请从目录 %windir%\microsoft.net\framework64\v2.n.n.n 中运行 installutil.exe。


1
我正在使用Topshelf作为安装程序,而不是installutil。 - snappymcsnap
我在建议Topshelf在底层使用installutil。不过我找不到相关信息。 - Martín Misol
那篇文章是关于MMC snapins,而不是服务。它们没有关联。 - Harry Johnston

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