【问题标题】:"Unable to find a version of runtime to run this application" for 32bit app on 64bit Windows64 位 Windows 上的 32 位应用程序“无法找到运行此应用程序的运行时版本”
【发布时间】:2011-12-19 08:58:49
【问题描述】:

我正在开发一个 32 位 WinForm 应用程序(目标:.NET 3.5)。我的客户坚持将应用程序安装到“Windows\System32\clientname”文件夹并在启动时自动启动。另外,应用必须是 32 位的,所以我不能使用“任何 CPU”。

我正在使用 VS2010 在 Win7 x64 下进行开发,并且安装了所有版本的 .NET。当我启动应用程序时,我收到消息“无法找到运行此应用程序的运行时版本”。 在 Win7 x86 上它可以正常工作。这不是应用程序本身,我 100% 确定安装了所有必需的框架。

我知道在 x64 系统上,此文件夹不适用于 32 位应用程序,但正如我所说:客户坚持,不会让步。

在我明确告诉客户无法完成之前,我想探索所有选项。当然,我用谷歌搜索并搜索了这个不错的网站,但没有发现对我的特殊情况有帮助。

我的应用在同一文件夹中生成了另一个 32 位进程。当然,在 x64 上也不起作用,但我通过使用“Wow64DisableWow64FsRedirection”解决了这个问题,然后将其复制到另一个位置以从那里启动它(效果很好)。 我已经完成了我的作业,但是我找不到在 x64 下和那个特定文件夹中启动主应用程序的解决方案。

有吗?

【问题讨论】:

  • 为什么不能使用Any CPU?我敢打赌这就是你的 64 位系统的问题,而且在 32 位系统上运行完全不会有任何危害。
  • 客户有理由想要它吗?不想听起来傲慢,我假设您已经向他解释了 C:\Windows 是用于 Windows,而不是用于应用程序。
  • 我不会担心听起来光顾@AndrewCooper。我敢打赌,在没有听起来光顾的情况下不设法问它也是 OP 的问题! ;)
  • 应用程序必须是 32 位的,因为它使用第三部分 32 位 DLL。当然,我用我有限的外交技巧教育了客户:)。所以,让我们假设所有这些条件都是不可改变的。我的问题是:可以做到(使用任何技巧)还是绝对不可能?
  • 这里有一个说法可能会说服你的客户,但你的客户听起来不合理。所有应用程序都链接到系统 DLL。加载程序查找这些 DLL 的第一个位置是可执行文件所在的目录。该目录将包含无法加载到 32 位进程中的 64 位 DLL。

标签: c# .net x86 64-bit


【解决方案1】:

为了解决这个问题,我在我的 Win7 x64 机器上创建了两个文件夹:

  • C:\Windows\System32\ClientName;和
  • C:\Windows\SysWOW64\ClientName

接下来,我创建了一个针对 .NET 3.5 的简单 x86 WinForms 应用程序。我发现如果我将可执行文件复制到C:\Windows\System32\ClientName,我会收到与您报告的完全相同的错误消息。

但是,如果我将可执行文件复制到这两个目录,那么我可以从 C:\Windows\System32\ClientName 启动它,它工作得很好。

这个我没试过,但是我怀疑如果你有一个多程序集的应用程序,你只需要将*.exe文件复制到C:\Windows\System32\ClientName。然后所有其他文件(和 EXE)将驻留在 C:\Windows\SysWOW64\ClientName 目录中。

我知道,这是一个有点不整洁的解决方案,但是你的客户的要求一开始就有点不寻常。

【讨论】:

  • 这看起来像是一个解决方案。这很不寻常,但正如你所说,要求也是如此。谢谢约翰!
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 2016-08-26
相关资源
最近更新 更多