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

.net windows-services x86 64bit x86-64

104954 观看

13回复

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

作者: Epaga 的来源 发布者: 2019 年 5 月 29 日

回应 (13)


134

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

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

换句话说,运行:

%WINDIR%\ Microsoft.NET \框架\ 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文件的版本号。

最后请注意,在Visual Studio 2010中,工具将默认生成x86二进制文件而不是以前的任何CPU)。

System.BadImageFormatException的完整细节(说唯一的原因是不匹配的苦味实际上是一个粗略的过度简化!)。

BadImageFormatExceptionx64安装程序下的另一个原因是,在Visual Studio 2010中,默认的.vdprojInstall Project类型生成32位InstallUtilLib填充程序,即使在x64系统上也是如此(搜索“64位托管自定义操作抛出System.BadImageFormatException异常”)这页纸)。

作者: Ruben Bartelink 发布者: 29.01.2010 09:18

15

决定

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

作者: Epaga 发布者: 27.11.2008 07:39

9

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

C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319

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

作者: Sachin Kalia 发布者: 05.07.2013 07:35

6

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

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

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

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

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

Ruben关于Visual Studio 2010的32位输出的观察是这里的救世主。

我使用的是64位版本,installutil.exe当然,Visual Studio 2010版本的输出是32位。只是在这里添加一些额外的价值,你可以找到最新的.NET Framework和32位版本的关联installutil.exeC:\ WINDOWS \ Microsoft.NET \框架文件夹。使用此版本installutil.exe修复了我的问题; 服务安装顺利!

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

作者: James Crowther 发布者: 23.01.2013 08:43

1

万一它可以帮助任何人,我能够使用这个类似问题的答案修复同样的异常,但我没有得到使用installutil.exe的异常。

作者: Joseph Snow 发布者: 31.07.2014 04:02

1

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

  1. 右键单击Project
  2. 选择属性
  3. 检查“首选32位”
  4. 平台目标:任何CPU
作者: Michael Staples 发布者: 31.12.2018 08:21

0

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

作者: dermot kirk 发布者: 27.01.2016 11:57

0

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

作者: Daniel D 发布者: 06.10.2016 12:27

0

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

作者: GregN 发布者: 20.03.2018 08:07

0

在尝试了所有提到的解决方案之后,我发现在我的项目.csproj中PlatformTarget以某种方式添加了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>

删除线为我工作。

作者: SohamC 发布者: 15.08.2018 06:49

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团队解决。

作者: Soleil 发布者: 28.12.2018 10:08

0

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

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

在此输入图像描述

作者: VK_217 发布者: 18.01.2019 07:50

0

我今天遇到了这个问题。就我而言,我的应用程序的(必须是64位的DLL参考)平台目标设置为AnyCPU,但Prefer 32-bit 复选框根据目标平台部分被默认勾选。这是问题,并且在取消选中之后一切正常Prefer 32-bit

作者: mabiyan 发布者: 13.03.2019 09:12
32x32