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