将服务安装为x64

时间:2013-03-06 20:57:10

标签: c# visual-studio-2010 exception windows-installer

我使用Visual Studio 2010在64位系统上开发了一项服务。该服务只是一个访问辅助库中的Start和Stop方法的框架。该库访问64位COM对象,并且必须构建为x64。 COM对象是一个单独构建为x64并在64位环境中测试的DLL。我有一个安装程序来设置项目并通过自定义操作安装服务。

我使用绕过服务的测试应用程序调试代码,因此我可以确认服务正在访问的库是否正常工作。

我遇到的问题是安装时出现BadImageFormatException。我正在使用目标平台为x64的安装程序。如果我将所有内容构建为x64,我会收到以下消息:

Error 1001. Exception occured while initializing the installation: System.BadImageFormatException. Could not load file or assembly... or one of its dependencies. An attempt was made to load a program with an incorrect format.

如果我将服务设置为构建为任何CPU,则安装正常,服务可以访问库,但找不到COM对象。如果我删除安装该服务的自定义操作,则安装也将起作用。如果我然后尝试使用installutil手动安装服务,我会收到与上面相同的错误消息。

以下是我在服务中使用的库列表。

using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using MAPIMail;
using MAPIMail.Logging;

请注意,MAPIMail项目正在构建为x64。

当有人在x64系统上安装任何CPU时,有没有人知道为什么我不能专门安装x64服务。我感谢任何建议。

2 个答案:

答案 0 :(得分:5)

我尝试了Alex和Jacob Seleznev的解决方案,他们都工作了。我发现雅各布的link的第二个答案是Greg Sansom提供了最好的解决方案。为了帮助别人,我在下面复制了他的答案:

  

如果您的安装程序正在安装64位dll,则会发生这种情况。该   从MSDN复制以下内容:

     

如果将64位托管自定义操作添加到安装项目,则   Visual Studio构建过程嵌入了32位版本   将InstallUtilLib.dll作为InstallUtil安装到MSI中。反过来,32位   加载.NET Framework以运行64位托管自定义操作和   导致BadImageFormatException异常。

     

要解决此问题,请将32位InstallUtilLib.dll替换为   64位版本。

1. Open the resulting .msi in Orca from the Windows Installer SDK.
2. Select the Binary table.
3. Double click the cell [Binary Data] for the record InstallUtil.
4. Make sure "Read binary from filename" is selected and click the Browse button.
5. Browse to %WINDIR%\Microsoft.NET\Framework64\v2.0.50727.
6. The Framework64 directory is only installed on 64-bit platforms and corresponds to the 64-bit processor type.
7. Select InstallUtilLib.dll.
8. Click the Open button.
9. Click the OK button.
     

分享|编辑|标志7月23日回复' 11 3:09回答Greg Sansom 6,5781335

答案 1 :(得分:3)

我的猜测是你使用的32位InstallUtil只能安装为32位,你需要使用64位的Installutil,如上所述here