C# 检查我的程序是否在64位机器上以32位模式运行,如果以64位模式运行-如何强制它为32位

C# 检查我的程序是否在64位机器上以32位模式运行,如果以64位模式运行-如何强制它为32位,c#,windows-services,.net-2.0,x86,C#,Windows Services,.net 2.0,X86,我们在.NET2.0中创建了一个windows服务。我已经将平台目标设置为X86,安装程序设置为X86。它引用的项目被设置为ANYCPU 我们在64位服务器上运行这个。它必须是32位的,因为它访问的ODBC驱动程序是32位的,如果从64位应用程序访问,它们会爆炸性地爆炸 我已经看到,在64位机器上,一些进程旁边有*32表示32位,但是我创建的一个专门针对32位(X86)的测试似乎不是这样的,以查看它是否真的是这样。我们正在运行的服务在服务名称旁边没有显示*32 有什么想法吗?如果它不是以32位(

我们在.NET2.0中创建了一个windows服务。我已经将平台目标设置为X86,安装程序设置为X86。它引用的项目被设置为ANYCPU

我们在64位服务器上运行这个。它必须是32位的,因为它访问的ODBC驱动程序是32位的,如果从64位应用程序访问,它们会爆炸性地爆炸

我已经看到,在64位机器上,一些进程旁边有*32表示32位,但是我创建的一个专门针对32位(X86)的测试似乎不是这样的,以查看它是否真的是这样。我们正在运行的服务在服务名称旁边没有显示*32

有什么想法吗?如果它不是以32位(X86)的形式运行,那么我会感到惊讶,因为我强迫构建是这样的



更新后,我们发现它以64位运行,即使服务项目被迫以X86模式构建。什么会导致这种情况?

您可以使用
IntPtr.Size
(文档)。如果以32位运行,则返回4;如果以64位运行,则返回8。

用于将程序集标记为32位。如果您愿意,可以将其作为构建后步骤:

corflags.exe MyProgram.exe /32Bit+

我无法回答您的第二个问题(您可能希望为此创建一个单独的SO问题),为什么x86项目作为64位进程运行。

一个合理的解释是,您正在部署不同构建配置的输出


是否您将调试配置设置为以x86为目标,但没有对发布配置进行更改,从而将其保留为AnyCPU并部署到生产环境中?

使用corflags.exe询问程序集运行的模式。@xanatos,我不认为这是重复的。OP不想(尽管他的问题标题有误导性)确定他是在32位还是64位模式下运行。他想强制32位模式,因为他的代码依赖于ODBC。那么,它会像应该的那样崩溃吗?勾选Taskmgr.exe中的“显示来自所有用户的进程”选项。@DarinDimitrov认为目前投票最多的答案是
IntPtr.Size
。。。也许OP应该学会给出更有意义的标题。。。他甚至不确定自己是以32位还是64位运行:-)是的,这是一个大爆炸-但我们想知道这是因为它是以64位运行的,还是有其他问题。它以64位运行。是的,但这实际上并不能回答为什么Windows服务以64位运行的问题。OP需要使用32位ODBC,从而强制其服务以32位运行,因此检测他以64位运行实际上不会有多大帮助。他所能做的最好的事情就是显示一条消息,说这个产品的程序员做了一些错误的事情,不能在这个系统上运行。是的,但它确实允许人们验证进程是否以32位的方式运行。是的,这是真的。它允许验证这一点。但这并不是OP所要求的,事实就是如此。每个项目的构建属性都设置为X86,但是当我查看安装项目的属性时,configuration manager显示它正在将其他项目构建为AnyCPU。我以为它会把这些设置带过去-我猜不会:|
private static bool Is64BitConfiguration()
{
     return System.IntPtr.Size == 8;
}