我的安装解决方案包含安装程序项目(不是Web安装程序,而是简单的安装程序),它安装了NT服务,Web服务和网站,并附带了两个dll项目,并使用我自己的代码执行安装步骤。在安装程序项目的用户操作中,我调用其中一个项目的安装程序功能,此项目调用第二个项目的安装程序:installer - > MiddleCaller - > InstallationCore。
所有这些都是在Windows 7上开发的,当我用32位编译所有这些时工作正常。
项目必须在Windows 2008上运行。由于某些原因,所有项目必须都是x64位 为此,在MiddleCaller和InstallationCore中单击项目上的鼠标右键 - >构建 - >目标x64。要在安装程序的属性中将安装程序项目移动到64位(当项目处于活动状态时),请检查:目标平台:x64。
当我在x86上运行安装时,我收到错误:
The installation package is not supported by this processor type"
这很好,因为现在我知道我的安装是用64位编译的,但是当我在Windows 2008上运行时,我得到:
Error 1001. Exception occured while initializing the instance:
System.BadImageFormatException: could not load file or Assembly
'MiddleCaller, v...' or one of its dependencies. An attempt was
made to load a program with an incorrect format.
任何人都知道我需要做什么才能在x64上安装好运行?
可能我仍然没有将安装程序项目移动到x64位,如果是,我这样做了吗?
谢谢你。
答案 0 :(得分:4)
在微软的网站上找到了一个快速提示,可能对troubleshooting setup and deployment projects有用:
64位托管自定义操作抛出System.BadImageFormatException异常
如果将64位托管自定义操作添加到安装项目,则Visual Studio构建过程会将32位版本的InstallUtilLib.dll作为InstallUtil嵌入到MSI中。反过来,加载32位.NET Framework以运行64位托管自定义操作并导致BadImageFormatException异常。
要解决此问题,请将32位InstallUtilLib.dll替换为64位版本。
从Windows Installer SDK中打开Orca中生成的.msi。
选择二进制表。
双击记录InstallUtil的单元格[二进制数据]。
确保选中“从文件名读取二进制文件”,然后单击“浏览”按钮。
浏览到%WINDIR%\ Microsoft.NET \ Framework64 \ v2.0.50727。
请注意 Framework64目录仅安装在64位平台上,对应于64位处理器类型。 选择InstallUtilLib.dll。
单击“打开”按钮。
单击“确定”按钮。
答案 1 :(得分:0)
在这种情况下有一些不清楚的事情。我知道您在运行调用64位程序集的32位安装程序时遇到困难。如果这是正确的,那么你不能做什么。您不能在同一进程中拥有32位和64位程序集 - 这是非法的。如果安装程序直接引用64位程序集,则安装程序也必须是64位。
作为澄清:我相信32位安装程序可以安装64位应用程序,但它可能只能通过复制64位文件而不是实际调用64位文件来实现。支持这种方法的唯一方法是将64位文件加载到不同的进程中并使用IPC调用它们,但即使这样也可能是一个糟糕的解决方案。
在您的情况下,我建议您将安装程序转换为64位安装程序。
答案 2 :(得分:0)
所以,最终,我在AnyCpu模式下编译了MiddleCaller和InstallationCore,当我需要安装的所有dll和可执行文件都是用x64位编译的时候。所有这些我在Windows 2008 x64位上编译,具有x64位外部依赖性(如Oracle客户端)。