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

时间:2010-03-25 22:32:08

标签: .net x86 64-bit multi-targeting

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

如果我在x64中构建它,它会以64位模式正确加载。但是,“Any Cpu” - 这就是我想要的 - 加载32位,即使它运行的机器完全支持64位。

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

我们有第三方工具以及引用c ++托管程序集。这些可能是也可能不是为任何CPU构建的。事实上我知道c ++托管程序集只是为x86构建的。然而,奇怪的是,如果我专门指定x64,该进程将启动并在x64中工作。如果框架试图加载c ++托管程序集,它将失败。我不介意这一点,因为在代码中,如果我们以64位模式运行,我们不会加载32位托管++程序集。可能是构建数据,因为这里有一个32位程序集,它应该将启动过程(在本例中是一个Windows服务程序集)标记为x86?

4 个答案:

答案 0 :(得分:17)

如果有人遇到我做的同样的事情:我创建了两个新的配置设置(从Debug配置中复制)。出于某种原因,“Prefer32Bit”标志设置为true,即使复选框在项目配置页面中显示为灰色并取消选中

您可以直接从.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>

答案 1 :(得分:13)

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

C:\Windows\Microsoft.NET\Framework64\v2.0.50727>ldr64.exe query
loading kernel32...done.
retrieved GetComPlusPackageInstallStatus entry point
retrieved SetComPlusPackageInstallStatus entry point
Current status is: 0x00000001

1 - 表示'将AnyCPU作为64位运行' 0 - 表示“将AnyCPU作为32位运行”

虽然我在.Net v4文件夹中找不到这样的实用程序,但该设置也适用于Net4 AnyCPU程序集。此标志保存在键 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NETFramework

下的DWORD注册表值 Enable64Bit

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

请注意,此设置是系统范围的。默认情况下,Enable64Bit设置为1.似乎某些应用程序将其重置为0,并且将值恢复为可能会导致该应用程序出现问题。

答案 2 :(得分:1)

感谢this answer。我使用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-

答案 3 :(得分:-1)

如果启动CLR的app exe被编译为:

  1. x64:AnyCPU程序集使用JIT编译程序集的x64版本(慢)。 x86程序集将获得BadImageFormatException。
  2. x86:AnyCPU程序集JIT到x86。 x64程序集将获得BadImageFormatException。
  3. AnyCPU:。Net将默认为x86。见上文。
  4. 我经常使用一个入门应用程序,我将.exe显式编译为x64或x86,并发布.msi的x86和x86版本。这可能是最简单的方法 - 性能提升通常值得管理其他文件的开销。

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

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