为什么我使用64位的installutil时,我的.NET进程以32位运行?

4
我们有一个C#控制台应用程序,我们已将其安装为Windows服务。目标64位计算机正在运行Windows Server 2012。我们使用了64位的installutil实用程序:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>installutil -i C:\Services\MainService\Service.exe

然而,当我在任务管理器中看到进程正在运行时,它显示为32位进程:

Snapshot_of_task_manager_32bit_process

您有任何想法为什么会这样?我该如何使进程以64位运行?

我在这里看到了这个问题的帖子,但还没有人回答:

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


2
似乎应用程序本身是编译为在任一配置上运行,或者明确为仅32位。我认为这与InstallUtil无关。 - gravity
安装程序与所安装的东西是分开的exe文件。也许有时您需要一个64位的安装程序来安装64位的程序,但除此之外,它们是独立的东西,64位的安装程序可以轻松安装32位的程序。对于Visual Studio,当您构建自己的程序时,必须确保将其设置为64位--不要设置为“任何CPU”,也不要勾选“偏好32位”。 - Quantic
你是否考虑过显式编译 x64(而不是“任何”)? - Dweeberly
我对 DLL 运行了 corflags。-- 你不应该对截图中的 .exe 运行它吗? - Quantic
希望我不必手动从解决方案文件中的每个单独项目中删除“首选32位”设置。 :-( - Jose
显示剩余5条评论
1个回答

4
我最终所做的是使用 CorFlags.exe 从 EXE 文件中移除 32BITPREF 标志。我只需在 TeamCity 中设置一个构建步骤即可覆盖此操作。
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\"CorFlags.exe Service.exe /nologo /32BITPREF-

我认为更好的方法是手动检查每个项目并禁用该标志。正如有人提到的那样,简单的grep和sed可能会解决问题。


更新

清除“偏好32位”标志是更好的选择。这确保编译64位版本,并且不需要在TeamCity构建配置中使用自定义脚本。


嗯,不,你只需要在服务EXE项目中更正抖动强制选项。 项目>属性>生成选项卡,取消选中“首选32位”选项,并确保平台目标设置为AnyCPU。 对于发布配置,重复此操作。 - Hans Passant
从他的评论来看,我认为他有50多个项目需要更改,而且他不想要去“项目>属性>构建”选项卡50次。 - Quantic
1
正如所述,只有EXE项目中的设置才是重要的。由于它首先启动,因此锁定了服务进程的位数。 - Hans Passant
1
不要忘记在Debug和Release两种模式下都进行更改,因为我刚刚发现了这一点... - Carra

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