System.BadImageFormatException:无法加载文件或程序集(来自installutil.exe)

时间:2008-11-27 07:39:02

标签: .net windows-services x86 64-bit x86-64

我正在尝试使用InstallUtil.exe安装Windows服务并收到错误消息

  

System.BadImageFormatException:无法加载文件或程序集“{xxx.exe}”或其某个依赖项。试图加载格式不正确的程序。

是什么给出了?


编辑:(不是OP)从dup获取的完整邮件获得更多点击[对于googleability]:

  

C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C:\ xxx.exe       Microsoft(R).NET Framework安装实用程序版本4.0.30319.1       版权所有(c)Microsoft Corporation。保留所有权利。

     

初始化安装时发生异常:       System.BadImageFormatException:无法加载文件或程序集'file:/// C:\ xxx.exe'或其依赖项之一。试图加载格式不正确的程序..

17 个答案:

答案 0 :(得分:139)

有关完整性的更多细节,以防有人......

请注意,这几天此异常的最常见原因是尝试将32位特定(/platform:x86)DLL加载到64位进程中,反之亦然(即加载64位特定的(/platform:x64)DLL进入32位进程。如果您的platform是非特定的(/platform:AnyCpu),则不会出现这种情况(假设没有引用的依赖项具有错误的位数)。

换句话说,跑步:

  

%windir%\ Microsoft.NET \ Framework \ v2.0.50727 \ installutil.exe

或:

  

%windir%\ Microsoft.NET \ Framework 64 \ v2.0.50727 \ installutil.exe

不起作用(在其他框架版本中替换:v1.1.4322(仅限32位,因此不会出现此问题)和v4.0.30319,如上所述。)

显然,如其他答案中所述,还需要运行的installutil的.NET版本号> =(最好是=)您正在运行的EXE / DLL文件的版本号。的安装人员。

最后,请注意in Visual Studio 2010, the tooling will default to generating x86 binariesrather than Any CPU as previously)。

Complete details of System.BadImageFormatException(说唯一的原因是不匹配的苦涩实在是过于简单了!)。

x64 安装程序下BadImageFormatException的另一个原因是in Visual Studio 2010, the default .vdproj Install Project type generates a 32-bit InstallUtilLib shim, even on an x64 system(在页面上搜索“64位托管自定义操作会抛出System.BadImageFormatException异常” )。

答案 1 :(得分:16)

确保最新的框架(您编译应用程序的框架)首先在PATH中。这解决了我的问题。 (找到on a forum

答案 2 :(得分:10)

我认为您使用该工具的64位版本来安装32位应用程序。 我今天也遇到了这个问题,并使用了这个框架路径来满足。

C:\的Windows \ Microsoft.NET \框架\ v4.0.30319

它应该安装你的32位应用程序。

答案 3 :(得分:6)

好吧,这就是我遇到的问题,而且修正了它,似乎与上述问题非常相关。

我正在使用Visual Studio 2010 Express。我写了一个没有真正做任何事情的测试服务。这只是后来真正的实践。

我编写了该服务并尝试使用installutil.exe进行安装,并出现以下错误:

  

System.BadImageFormatException:无法加载文件或程序集“{filename.exe}”或其依赖项之一。试图加载格式不正确的程序。

到目前为止与原作者相同。

关于Visual Studio 2010的32位输出的

Ruben's observation是这里的救世主。

我使用了installutil.exe的64位版本,果然,Visual Studio 2010版本的输出是32位。只是为了在这里添加一些额外的值,你可以在 C:\ Windows \ Microsoft.NET \ framework 中找到32位版本的最新.NET框架和相关的installutil.exe。夹。使用此版本的installutil.exe解决了我的问题;服务安装顺利!

我希望这有助于其他人。

答案 4 :(得分:2)

就我而言,我使用了如下所示的 Framework64

cd\
cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
installutil.exe "C:\XXX\Bin\ABC.exe"
pause

答案 5 :(得分:1)

我在使用VS 2015的WinForms项目中遇到了这个问题。我的解决方案是:

  1. 右键单击项目
  2. 选择属性
  3. 选中“首选32位”
  4. 平台目标:任何CPU

答案 6 :(得分:1)

如果它可以帮助任何人,我可以使用this answer将类似的问题解决同样的异常,但我没有使用installutil.exe获得异常。

答案 7 :(得分:0)

我有同样的问题。我使用标准命令执行。它正在调用X64测试对抗X86测试。我需要指定X86而不是nunit-runner的X64版本。

答案 8 :(得分:0)

总结一下,Build和Project \ Build \ Platform都必须设置为x64才能在64位系统上成功安装64位服务。

答案 9 :(得分:0)

我的问题不同了。这是在我的Windows 7机器意外关闭后发生的。我执行了一个干净的解决方案,它按预期运行。

答案 10 :(得分:0)

尝试了所有提到的解决方案后,我发现StartActivity(intent)以某种方式添加到了项目.csproj中的PlatformTarget配置中。

AnyCPU

删除行对我有用。

答案 11 :(得分:0)

如果在在线测试中有此消息,但在单元测试中没有 ,则是因为选中的程序集被即时复制到$(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\。但是有时很少选择程序集,例如在互操作c ++ / c#项目的情况下使用VC ++ dll。

构建后的xcopy无法解决问题,因为实时测试引擎将删除复制的文件。

迄今为止(2018年12月28日),唯一的解决方法是避免进行实时测试,并使用属性[TestCategory("SkipWhenLiveUnitTesting")]应用于测试类或测试方法来进行单元测试中的所有操作。

此错误在任何Visual Studio 2017 15.9.4或更高版本中均可见,并且需要Visual Studio团队加以解决。

答案 12 :(得分:0)

目标版本x64托管IIS 64位的目标服务器

右键单击运行网站/ Web应用程序的appPool托管,然后设置 启用32位应用程序= false。

enter image description here

答案 13 :(得分:0)

我今天遇到了这个问题。在我的情况下,我的应用程序的(具有对64位dll的引用)平台目标设置为AnyCPU,但在Prefer 32-bit 复选框下默认情况下选中平台目标部分。这就是问题所在,并且取消选中Prefer 32-bit选项后一切正常。

答案 14 :(得分:0)

我们针对具有相同症状的问题找到了不同的解决方案:

将项目从.net 4.7.1更新到4.7.2时,我们看到了此错误。

问题在于,即使我们在项目中不再引用System.Net.Http,它仍被列在web.config的dependentAssembily部分中。从web.config中删除此引用和任何其他未使用的程序集引用即可解决此问题。

答案 15 :(得分:0)

关键是在两个地方为项目设置匹配处理器设置。

enter image description here

并确保“测试”菜单>>“测试设置” >>“默认处理器体系结构”中的体系结构设置相同,如下所示。

enter image description here

这是针对VS2013的,但其他版本也可能相同。

答案 16 :(得分:0)

问题在于,每个System.BadImageFormatException: Could not load file or assembly都与该installutil.exe无关,所有指向该线程。

  1. 如果您的问题与WindowsBasePresentationFramework有关 dll,并且您已经安装了分析仪,请确保它们都已安装 为解决方案中的所有项目或没有安装的项目安装 他们。

    enter image description here

  2. 在库的.csproj文件中引用整个框架,而不仅仅是两个dlls

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
    
  3. 删除binobj目录,清理解决方案并重建。