我们有一大套产品,包括:
所有 .NET 代码都是用 VS2008 编写的,针对 .NET 3.5 和“任何 CPU”。我们可以针对特定的处理器,但不希望这样做,因为这会导致问题进一步深入到依赖树中。我们还不能将任何东西转移到 .NET 4.0,尽管它稍后会成为一个选项。
所有应用程序共享一些重要的注册表项。我们通过让 .NET 代码始终查看 32 位注册表视图来解决注册表重定向问题。
一些 .NET 代码通过 COM 互操作与 VB6 DLL 对话,但这非常有限,我们可以轻松地删除这种依赖(现在注释掉,稍后在 .NET 中重新编写)。
所有网络应用程序和服务都设计为在 IIS 中托管。需要支持 5.1 之后的所有版本。
我们的构建虚拟机当前运行的是 Windows XP(32 位)。如有必要,我们可以创建新的。
我的任务是确保一切都在 64 位 Windows(所有版本)上正常运行。我目前在使用 .NET 安装项目时遇到问题,所有这些项目都是使用 VS2008 安装项目模板编写的。
即使源代码是Any CPU,安装项目也没有这个功能。您必须将
TargetPlatform
属性设置为一个处理器。这不是很有用。我们不能有一个 setup.exe
在 32 位操作系统上安装为 32 位,在 64 位操作系统上安装为 64 位吗?如果我是安装应用程序的最终用户,我不知道要运行哪个安装程序。
此后我研究了 VS2010 安装项目、WiX 和 InstallShield,它们的行为方式都相同。我将不得不把这个问题写成“不可能”。我打算做:
我有一个应用程序决定在运行时加载哪些 DLL,包括 32 位还是 64 位 DLL。我最终与我的老朋友 setup2go 一起完成了这项工作。不管什么不能将 64 位 dll 放入 x86 安装程序,除非将其更改为 x64 但这不是我想要的,它也应该安装在 32 位系统上,64 位 DLL 会占用一些空间但无害.
所以只需谷歌 setup2go,这是可能的,也许只是不使用 MSI。
我注意到,对于 VS Installer 项目,您的安装程序可以是 x86,但如果您的应用程序的构建是 AnyCPU,它将像忽略安装程序的目标一样运行。