我使用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服务。我感谢任何建议。
答案 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