【问题标题】:Possible 64-bit operating system issues in C# developmentC# 开发中可能出现的 64 位操作系统问题
【发布时间】:2010-12-25 18:51:47
【问题描述】:
我正在将我的操作系统更新到 Windows 7 x64,我只有运行 32 位操作系统的经验。有人对 64 位环境有什么不好/好的经历吗?
作为参考,我使用的工具有:
【问题讨论】:
标签:
c#
visual-studio-2008
windows-7
64-bit
【解决方案1】:
在 64 位操作系统上运行会产生一些副作用,这些副作用在某种程度上会很明显。最常见的问题:
在 Visual Studio 中编辑并继续不起作用。您可以通过强制 .NET 应用程序在 32 位模式下运行来解决此问题。项目 + 属性,构建选项卡,平台目标 = x86。在 VS2013 中解决。
如果您在 .NET 应用程序中使用任何 ActiveX 控件或 COM 组件,您可能会发现您的程序不再工作,因为您的计算机没有相应的 64 位版本的 COM 服务器。您将收到错误 0x80040154、REGDB_E_CLASSNOTREG、“类未注册”。与上述相同的修复。
64 位调试器不支持混合模式调试,您必须提交仅限托管或仅限本机调试。与上述相同的修复,只要您没有 64 位特定问题。在 VS2010 中解决。
在需要 IntPtr 的地方声明 uint 或 int 的编写不当的 P/Invoke 声明将停止在 64 位模式下工作。您通常会收到 AccessViolation 异常或失败返回代码。或 PInvokeStackImbalance MDA 警告。定位错误应该没有任何问题,只需修复声明即可。
几个旧的生命周期结束的 Microsoft 库在 64 位版本中不可用。这是 Microsoft Access 数据库最常见的问题。与上述相同的修复。
您必须使用正确版本的 Regasm.exe 来注册 [ComVisible] 程序集。根据客户端程序是以 64 位还是 32 位模式运行,从 Framework 或 Framework64 中选择一个。如果您希望服务器在其中任何一个中可用,或者两者都可用。
一些 COM 类型库在其方法声明中包含位相关参数。 ADO 2.8 是一个值得注意的版本。请务必使用正确的 Tlbimp.exe 位数来生成正确的 COM 互操作程序集,Visual Studio 不会这样做。与 Regasm.exe 相同的方法
32 位程序的注册表视图与 64 位程序不同。特别是 HKCR 和 HKLM\Software 配置单元是虚拟化的。在 Regedit.exe 中,32 位可见键位于 HKLM\Software\Wow6432Node 键下。这可能会导致使用注册表的程序出现许多微妙的问题。 .NET 4 RegistryKey.OpenBaseKey() 允许指定您想要的视图。
再次对于 COM,您将可以使用 Regsvr32.exe 的正确位数来注册非托管 COM 服务器(不是 .NET 服务器,它们使用 Regasm.exe)。 64 位服务器使用 c:\windows\system32 中的那个,32 位服务器使用 c:\windows\syswow64 中的那个。
文件系统中的文件夹被虚拟化,特别是 c:\windows\system32 和 c:\program 文件。 32 位程序将看到 c:\windows\syswow64 和 c:\program 文件 (x86)。
安装人员需要考虑以上所有问题。
【解决方案2】:
我不会太担心,如果每个程序都有一个 x64 下载链接,那么就使用它。如果没有,那么您的代码将通过 WOW64 仿真运行。在您看来,它运行正常。
请参阅this related question 我大约 5 分钟前回答。
WOW64 指 windows64 上的 windows32
它是一个透明的仿真
允许x86程序运行的laywer
在 x64 操作系统上。 WOW64将
如果您运行
x64 Windows 上的 x86 Windows 程序
操作系统。
【解决方案3】:
我正在运行 Windows 7 Ultimate x64。
- Visual Studio 2008 工作正常。
- 我使用的是 Subversion,但不是 Tortoise。 AnkhSVN 运行良好。
其他我没有经验。
【解决方案4】:
我使用的大多数软件都没有 x64 问题,XP x64 问题已经过去几年了,人们似乎已经赶上了 x64。
然而,x64 开发的主要问题是在 Visual Studio 中以 x64 模式运行时,您无法在调试时编辑代码。
您必须使用 x86 作为目标平台才能这样做。
这是 Visual Studio 2010 的测试版之一默认目标平台为 x32 而不是任何平台的原因之一...