设置同时针对x86和x64的目标?

19
我有一个需要同时使用x64和x86 dll的程序(它会在运行时找出需要哪些dll),但是当我尝试创建安装程序时,它报错:

AlphaVSS.WinXP.x64.dll'文件针对 'AMD64' 不兼容项目的目标平台 'x86'
AlphaVSS.Win2003.x64.dll'文件针对 'AMD64' 不兼容项目的目标平台 'x86'
AlphaVSS.Win2008.x64.dll'文件针对 'AMD64' 不兼容项目的目标平台 'x86'

如何让我的安装程序像我的程序一样同时支持两个平台?
4个回答

11

在Visual Studio中创建的安装项目生成的MSI只能同时针对一个平台进行。您的选择是制作2个MSI,将它们合并并创建自定义设置引导程序,在两者之间进行选择。

例如,有一些第三方产品,如Advanced Installer,可以为您完成此操作。


6

我也遇到过这个问题,并且写了一篇博客文章介绍我的解决方案:

  • 使用deflate.exe压缩文件,并将其重命名为不同的扩展名(例如.x64)
  • 将其作为内容文件添加到主项目中
  • 在解决方案中添加自定义操作项目
  • 将自定义操作添加到设置项目的“安装”自定义操作中
  • 在自定义操作的Install方法中使用System.IO.Compression.DeflateStream对文件进行解压缩(请参见上面的代码)
  • 在您的桌子周围,走过走廊,并经过尽可能多的同事,跳一支小舞蹈:)

deflate.exe文件可以从其在google code上的存储库中下载。


1
这是一个非常好的想法,我最近在一个项目中使用了它。但有一个问题:如果你的自定义操作在解压缩文件后删除了压缩文件(或者你提取了zip文件的内容然后删除了zip文件),并且你的安装程序安装了快捷方式。默认情况下,快捷方式是广告的,这意味着当你启动它们时,系统会检查安装是否完整,并在发现压缩文件丢失时重新运行安装程序。你需要更改msi文件,以便不广告快捷方式。 - Wayne Citrin

1

.Net有一个“任意CPU”选项。人们很容易认为它是更像一个“通用”的选项,只会使用较低的x86特性,但实际上它允许每台机器上的JIT编译器选择适合该机器的适当cpu类型。

唯一不应使用它的时候是如果您知道您有依赖项或要求对其中一种架构不好。例如:您知道需要大量的内存,您有一个32位本地dll的依赖关系,或者您想预编译应用程序。

这里存在危险,因为您具有平台特定的dll依赖关系。但是,您拥有两种类型的dll,并且听起来您知道如何在运行时选择正确的dll。那么“任意CPU”选项是否适合您?


我的项目设置为任何,但是安装程序不允许该选项。安装程序的属性TargetPlatform有x86、x64和Itanium选项,但没有任何选项。 - Malfist
1
安装无法编译为 x86。只能编译为 x64。(会出现我在问题中提到的错误。) - Malfist
即使我将其添加为“文件”,它仍然会将其视为汇编代码,我无法阻止这种情况发生。 - Malfist
+1d。有关此事的更多信息,请参见http://blogs.msdn.com/rmbyers/archive/2009/06/8/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspx - Ruben Bartelink
对于那些仍然感兴趣的人(在这个帖子发布多年后),Ruben Bartelink上面提供的链接仍然存在(截至本文撰写时),但已经移动到此处:https://learn.microsoft.com/en-us/archive/blogs/rmbyers/anycpu-exes-are-usually-more-trouble-than-theyre-worth - Larry
显示剩余3条评论

-2
  1. 打开一个部署项目。
  2. 在“解决方案资源管理器”中,选中部署项目。
  3. 在“属性”窗口中,选中“TargetPlatform”属性。
  4. 选择Intel Itanium 64位平台的Itanium,或选择任何其他64位平台(如AMD64和EM64T指令集)的x64。
  5. 在安装时,如果目标计算机与指定的平台不兼容,则会引发错误并停止安装。

1
这怎么回答问题了呢? - etaiso
人们遇到了他们想要解决的问题,如果您有解决方案,请提供,不要将相同的问题作为答案陈述。 - jan_kiran

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