我已经将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?
答案 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被编译为:
我经常使用一个入门应用程序,我将.exe显式编译为x64或x86,并发布.msi的x86和x86版本。这可能是最简单的方法 - 性能提升通常值得管理其他文件的开销。
或者,您可以在安装过程中使用ngen,它将在安装应用程序时执行所有JIT操作。您会注意到应用程序的启动时间有所改善。
另外,正如我最近发现的x86应用程序,.net应用程序的内存限制为2GB。即使你的x86上有4GB的ram并且剩下大量的内存,也会发生这种情况。