2

如果我有一个用 C# 编写的 32 位应用程序,我需要做什么才能将其转换为 64 位?我假设它更复杂,然后只需在 Visual Studio 中将目标机器更改为 64 位并重新编译。

4

7 回答 7

6

如果您不使用互操作(COM、WinAPI)并且不对指针的大小做出假设,则可以直接切换到其他平台。即使使用后者,您也可能没问题,除非您使用在某处做出上述假设的库。

引用有关System.IntPtr的 MSDN :

IntPtr 类型被设计为一个整数,其大小是特定于平台的。也就是说,这种类型的实例预计在 32 位硬件和操作系统上为 32 位,在 64 位硬件和操作系统上为 64 位。

– 但其他 .NET 类型设计为具有固定大小,与平台无关。

于 2009-10-19T18:46:56.083 回答
4

您真的需要它以 64 位运行还是只希望它在 64 位机器上运行?

对于后者,您可以将 C# 项目设置为以 Win32 为目标,而不是 AnyCPU。这意味着当您在 64 位机器上运行它时,它将通过 WOW(32 位“仿真”)运行,这具有(非托管)JET 驱动程序也将运行 32 位的优势。这应该可以解决您的问题。

于 2009-10-19T19:01:02.387 回答
2

这取决于您的应用程序在做什么。如果它使用非托管 API、P/Invoke 和指针算法,那么如果不进行一些修改,它很可能无法在 64 位平台上运行。否则你就可以了,你甚至不需要指定一个平台,只需要针对任何 CPU 就可以了。

于 2009-10-19T18:46:34.997 回答
2

我的一位同事刚刚在他的一个个人项目中遇到了问题。事实证明,微软没有为 64 位编写 Jet 驱动程序,也没有这样做的打算。

这很奇怪,因为 Office 2010 将有一个 64 位版本。

我对您的建议是将项目属性设置为 x86(不是任何 CPU)并将其保留在那里。Windows 64 位可以毫无问题地运行 32 位应用程序,它们无法运行 16 位应用程序。

于 2009-10-19T19:02:05.553 回答
1

按照这个问题的建议怎么做?我以前从来没有这样做过,我会注意的。

于 2009-10-19T18:48:06.053 回答
0

http://msdn.microsoft.com/en-us/library/ms241064.aspx

其他评论是好点。您还需要了解注册表虚拟化和 Wow64 节点的变化。

于 2009-10-19T18:49:16.753 回答
0

我假设它更复杂,然后只需在 Visual Studio 中将目标机器更改为 64 位并重新编译。

也许不吧。如果你对外部库没有任何依赖,这就是你所要做的。除此之外,更具挑战性的是部署。您不想将 64 位二进制文​​件发送给 32 位用户。因此,更好的是,选择“Any CPU”选项,您的应用程序将在 64 位机器上自动 JIT 编译为 64 位(安装了 64 位版本的框架)和 32 位 (x86) 无处不在别的。

但是您必须非常确定您没有任何 32 位依赖项。

于 2009-10-19T18:57:51.277 回答