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

问题描述 投票:93回答:15

我正在尝试使用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'或其依赖项之一。尝试加载格式不正确的程序。

.net windows-services x86 64bit x86-64
15个回答
142
投票

一些更详细的完整性,以防它有助于某人......

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

换句话说,运行:

%WINDIR%\ Microsoft.NET \框架\ V2.0.50727 \ installutil.exe

要么:

%WINDIR%\ Microsoft.NET \ Framework64 \ 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异常”)。


0
投票

如果在实时测试中有这个消息,而不是在单元测试中,那是因为所选的程序集被动态复制到$(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\。但有时可能没有选择几个程序集,例如,在interop c ++ / c#项目的情况下VC ++ dll。

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

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

在任何Visual Studio 2017至15.9.4中都可以看到此错误,并且需要由Visual Studio团队解决。


0
投票

目标构建x64目标服务器托管IIS 64位

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

enter image description here


0
投票

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


0
投票

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

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

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


0
投票

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

enter image description here

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

enter image description here

这适用于VS2013,但也可能与其他版本相同。


16
投票

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


10
投票

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

C:yuwindsumitzrosoft

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


6
投票

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

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

我编写了该服务并尝试使用installutil.exe安装它并收到以下错误:

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

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

Ruben's observation上面关于Visual Studio 2010的32位输出是这里的救世主。

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

我希望这可以帮助其他人。


1
投票

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

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

删除线为我工作。


1
投票

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

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

0
投票

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.