我已经将Windows服务构build为“任何CPU”。 为什么它在我的64位机器上以32位模式运行?

我已经将Windows服务构build为“任何CPU”。 但是,当我在我的64位机上运行它时,它运行在32位。 我该如何解决? 我正在使用.NET和C#,我的操作系统是Windows 2008 R2。

如果我在x64中构build它,它将以64位模式正确加载。 然而,“任何Cpu” – 这是我想要的 – 加载在32位,即使它运行的机器完全支持64位。

编辑根据反馈添加更多信息

我们有第三方工具以及参考c ++托pipe程序集。 这些可能会或可能不会为任何CPU构build。 事实上,我知道c ++托pipe程序集只是为x86构build的。 然而,奇怪的是,如果我特别指定x64的过程将启动,并在x64工作。 如果框架试图加载c ++托pipe程序集,则会失败。 我不介意,因为在代码中,如果我们在64位模式下运行,我们不会加载32位托pipe的++程序集。 难道这个构build数字是因为在这里有一个32位的程序集,它应该把启动过程(在这种情况下是一个Windows服务程序集)标记为x86?

如果有人跑过同样的事情,我做了:我已经创build了两个新的configuration设置(从debuggingconfiguration复制)。 出于某种原因,“Prefer32Bit”标志被设置为true, 即使checkbox变灰,并在项目configuration页面中未选中

您可以通过直接从.csproj文件中删除行来修复它。

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Staging|AnyCPU'"> <DebugSymbols>true</DebugSymbols> <OutputPath>bin\Staging\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <DebugType>full</DebugType> <PlatformTarget>AnyCPU</PlatformTarget> <ErrorReport>prompt</ErrorReport> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <Prefer32Bit>true</Prefer32Bit> <!-- REMOVE THIS LINE --> </PropertyGroup> 

有一个设置可以强制AnyCPU程序集在x64操作系统上以32位的方式运行。
使用.Net2 x64目录中的ldr64.exe来检查状态:

  C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727> ldr64.exe查询
加载kernel32 ...完成。
检索GetComPlusPackageInstallStatus入口点
检索SetComPlusPackageInstallStatus入口点
当前状态是:0x00000001 

1 – 表示'运行AnyCPU为64位'
0 – 表示'将AnyCPU作为32位运行'

虽然在.Net v4文件夹中没有find这样的工具,但是这个设置也适用于Net4 AnyCPU组件。 此标志保存在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NETFramework项下的DWORDregistry值Enable64Bit中

此设置似乎在OS启动时加载,只更改registry值不会影响应用程序,直到重新启动。 使用ldr64.exe更改标志会立即生效。

请注意,此设置是系统范围的。 默认情况下,Enable64Bit被设置为1.看起来有些应用程序将其重置为0,并且将值还原可能导致该应用程序出现问题。

感谢这个答案 。 我使用CorFlags使它运行为64位

 corflags.exe WindowService.exe /32bitpref- /32bitreq- 

我使用的CorFlags版本是4.0.30319.17929,我在C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools 。 您可以尝试使用以下版本的旧版本:

 corflags.exe WindowService.exe /32bit- 

如果启动CLR的应用程序exe被编译为:

  1. x64:使用JIT编译程序集的x64版本(慢)的任何CPU程序集。 x86程序集将得到一个BadImageFormatException。
  2. x86:AnyCPU程序集JIT到x86。 x64程序集将得到一个BadImageFormatException。
  3. AnyCPU:.Net将默认为x86。 往上看。

我经常使用一个初学者应用程序,在那里我明确地将.exe编译为x64或x86,并提供.msi的x86和x86版本。 这可能是最简单的途径 – 性能提升通常是值得pipe理额外文件的开销。

或者,您可以在安装过程中使用ngen,这将在安装应用程序时执行所有的JIT工作。 您将注意到您的应用程序启动时间得到了改善。

另外,正如我最近在x86应用程序中发现的那样,.net应用程序有2GB的内存限制。 即使在x86上有4GB内存并且还有大量内存,也会发生这种情况。