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

Mar*_*ark 39 .net 64-bit x86 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?

Vyr*_*yrx 18

如果有人遇到我做过的同样的事情:我创建了两个新的配置设置(从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>
Run Code Online (Sandbox Code Playgroud)

  • 您实际上需要将标志设置为"false" - 在我的情况下,配置条目不存在,但VS编译为"prefer 32".VS 2015中的"build"下设置启用/禁用此功能.禁用它,在.csproj中添加一个条目"<Prefer32Bit> false </ Prefer32Bit>" (8认同)

mis*_*ika 15

有一个设置可以强制AnyCPU程序集在x64 OS上以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程序集.这个标志被保存在注册表中的DWORD值Enable64Bit下键HKEY_LOCAL_MACHINE\SOFTWARE \微软\ .NETFramework

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

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


小智 -1

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

  1. x64:使用 JIT 编译 x64 版本的程序集的 AnyCPU 程序集(速度慢)。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 内存并且有大量剩余内存,也会发生这种情况。

  • msdn 说的是不同的内容: http://msdn.microsoft.com/en-us/library/zekwfyz4.aspx “在 64 位 Windows 操作系统上... - 使用 /platform:anycpu 编译的可执行文件将在64 位 CLR - 使用 /platform:anycpu 编译的 DLL 将在与其加载的进程相同的 CLR 上执行” (6认同)