40

我已经将 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

4 回答 4

19

万一有人遇到我做的同样的事情:我创建了两个新的配置设置(从调试配置复制)。出于某种原因,“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>
于 2014-04-28T21:37:17.670 回答
15

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

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

1 - 表示“以 64 位运行 AnyCPU”
0 - 表示“以 32 位运行 AnyCPU”

虽然我在 .Net v4 文件夹中没有找到这样的实用程序,但该设置也适用于 Net4 AnyCPU 程序集。此标志保存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework项下的DWORD 注册表值Enable64Bit中

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

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

于 2013-02-13T15:43:57.610 回答
2

感谢这个答案。我使用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-
于 2013-05-02T16:50:22.993 回答
-1

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

  1. x64:AnyCPU 程序集使用 JIT 编译 x64 版本的程序集(慢)。x86 程序集将获得 BadImageFormatException。
  2. x86:AnyCPU 将 JIT 组装到 x86。x64 程序集将获得 BadImageFormatException。
  3. AnyCPU:.Net 将默认为 x86。看上面。

我经常使用启动应用程序,在其中我将 .exe 显式编译为 x64 或 x86 并发布 x86 和 x86 版本的 .msi。这可能是最简单的途径 - 性能提升通常值得管理额外文件的开销。

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

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

于 2010-03-26T06:13:51.967 回答