在64位Windows上运行32位应用程序时出现“无法找到运行此应用程序所需版本的运行时”错误

4
我正在开发一个32位的WinForm应用程序(目标:.NET 3.5)。我的客户坚持要将应用程序安装在“Windows\System32\clientname”文件夹中,并在启动时自动启动。此外,该应用程序必须是32位的,所以我不能使用“Any CPU”。
我正在Win7 x64下使用VS2010开发,并安装了所有版本的.NET。当我启动应用程序时,我收到了“无法找到运行此应用程序的运行时版本”的消息。 在Win7 x86上,它可以毫无问题地工作。这不是应用程序本身的问题,我百分之百确定已安装了所有必需的框架。
我知道在x64系统上不应该使用此文件夹来运行32位应用程序,但正如我所说:客户坚持并且不会妥协。
在我最终告诉客户无法完成任务之前,我想探索所有选项。我当然进行了谷歌搜索,并在这个好网站上搜索,但没有找到适合我情况的有用信息。
我的应用程序生成另一个位于同一文件夹中的32位进程。在x64上,当然也不起作用,但我通过使用“Wow64DisableWow64FsRedirection”并将其复制到另一个位置以从那里启动它来解决了这个问题(这很好地解决了问题)。 我已经完成了我的课程作业,但我就是找不到在x64上和特定文件夹中启动主应用程序的解决方案。
有吗?

客户有没有想要它在那里的理由?不想让人听起来像是教训,我假设你已经向他解释过C:\Windows是为Windows而不是应用程序而设计的。 - Andrew Cooper
我不会担心听起来像是在傲慢地对待@AndrewCooper。 我敢打赌,OP自己也有没有成功地问出问题而不显得傲慢的问题! ;) - Jon Hanna
应用程序必须是32位的,因为它使用了一个第三方的32位DLL。当然,我用我的有限的外交技巧向客户进行了教育 : )。所以,让我们假设所有这些条件都是不可改变的。我的问题是:是否可以通过任何技巧来完成它,还是绝对不可能? - Harald
4
以下是翻译的结果:这是一个可能会说服你的客户的论点,但你的客户听起来很不讲理。所有应用程序都链接到系统DLL。加载器查找这些DLL的第一个地方是可执行文件所在的目录。该目录将包含64位DLL,无法加载到32位进程中。 - David Heffernan
@David:好问题。基本上是由于历史原因。该应用程序的上下文在x64之前开发,并且一直驻留在那个不适当的文件夹中。除非绝对必要,否则他们不想更改安装程序...我在团队中还比较新,所以我的话权还不算太大。 - Harald
显示剩余8条评论
1个回答

3
为了解决这个问题,我在我的Win7 x64机器上创建了两个文件夹:
  • C:\Windows\System32\ClientName;
  • C:\Windows\SysWOW64\ClientName
接下来,我创建了一个简单的x86 WinForms应用程序,目标是.NET 3.5。我发现,如果我将可执行文件复制到C:\Windows\System32\ClientName,我会得到与您报告的完全相同的错误消息。
然而,如果我将可执行文件复制到这两个目录中,那么我就可以从C:\Windows\System32\ClientName启动它,并且它可以正常工作。
我没有尝试过这样做,但我怀疑如果您有一个多组件应用程序,您只需要将*.exe文件复制到C:\Windows\System32\ClientName。所有其他文件(和EXE)将驻留在C:\Windows\SysWOW64\ClientName目录中。
我知道这是一个有点不整洁的解决方案,但是你的客户的要求本来就有点不寻常。

看起来像是一个解决方案。虽然不寻常,但正如你所说,需求也是如此。谢谢约翰! - Harald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接