当在“C:\ Program Files(x86)”外部运行时,为什么我的WinForms应用程序不能在“x64”机器上编译为“x86”?

时间:2009-04-25 14:32:04

标签: .net winforms windows-server-2003 x86 64-bit

我们有一个在x86上运行良好的WinForms应用程序,但有许多第三方组件可以进行win32调用。为了让应用程序在x64上运行,我现在编译为x86平台。我们的习惯是在服务器上的系统分区外安装我们的胖客户端,所以我们昨天在Win2003 x64服​​务器上安装了“F:\ Program Files(x86)”。从该目录运行时,进程拒绝退出。我尝试在任务管理器,taskkill和Process Explorer中杀死它们,但是重新启动服务器就会杀死这些进程。当我在C:\ Program Files(x86)中卸载并重新安装时,进程正常退出。

在x64计算机上运行为x86编译的WinForms应用程序时,安装位置真的很重要吗?

2 个答案:

答案 0 :(得分:1)

根据我的经验,我可以说几乎可以在任何位置在x64系统上运行x86二进制文件(如果二进制文件在system32中,如果事情仍然有效,则尚未测试,但我确信x86程序可以运行来自Program Files)。我相信程序文件/程序文件(x86)文件夹可以轻松区分本机x64应用程序和旧的x86应用程序。根据您的描述,您所面临的问题听起来就像是一个WoW64兼容性问题,但是如果您依赖于非托管代码,那么您可能需要首先验证该非托管代码是否正常运行,然后深入了解阻止您的程序运行的问题。收盘。此外,知道如何首先终止应用程序,如果它使用多个线程或单个线程,定位的.NET运行时版本以及服务器上安装的版本,将会有所帮助(包括。服务包)。

答案 1 :(得分:1)

这是一个黑暗中的镜头。您的程序是否尝试读取或加载与应用程序一起部署在同一目录或子目录中的任何数据?如果是这样,您可能会遇到以下问题。

您的应用程序可能正在使用依赖于其运行的处理器体系结构的值来查找目录。以环境变量ProgramFiles为例。在64位计算机上,ProgramFiles环境变量实际上将指向32位应用程序的“Program Files(x86)”目录。所以你的程序可能正在尝试加载如下所示的数据并崩溃

string root = Environment.GetVariable("ProgramFiles");
string file = Path.Combine(root, "MyAppName\DataDirectory\SomeDataFile.txt");
string data = File.ReadAllLines(file);  

最后一行会失败,因为路径将解析为

  

c:\ program files(x86)\ MyApplication \ DataDirectory \ SomeDataFile.txt

但该应用程序已部署到Program Files中。所以真正的道路将是

  

c:\ program files \ MyApplication \ DataDirectory \ SomeDataFile.txt