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


104

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

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

是什么赋予了?


编辑:(不是由OP)从dup中提取的完整消息越来越多的命中[用于谷歌搜索]:

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

Answers:


154

完整性方面的一些详细信息,以防它帮助某人...

请注意,最近几天出现此异常的最常见原因是尝试将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文件的.NET版本号。

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

System.BadImageFormatException的完整详细信息(说出唯一的原因是不匹配的苦味确实是过于简化了!)。

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


我遇到了同样的问题,当我根据您上面所说的开始调试时,我发现Platform:被设置为x86。当我将其更改为任何CPU时,它都可以工作:)
Atta H.

我的Windows安装程序具有“自定义”操作。我的安装程序需要在x64系统上运行,因此“自定义操作”属性必须选中true的“ Run64Bit”选项。它解决了我的问题。
哈根



8

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

在此处输入图片说明

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

在此处输入图片说明

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

更新-对于VS2019:

在此处输入图片说明


这是解决此错误的正确方法。也就是说,如果您不想弄乱可能的数百个csproj文件。
Bizhan

6

好的,这是我遇到的问题,而解决该问题的方法似乎与上述问题相关。

我正在使用Visual Studio 2010 Express。我写了一个测试服务,但实际上并没有做任何事情。后来,这只是对真实事物的练习。

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

System.BadImageFormatException:无法加载文件或程序集'{filename.exe}'或其依赖项之一。试图加载格式错误的程序。

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

鲁宾在上面关于Visual Studio 2010的32位输出的观察是这里的救星。

我使用的64位版本,installutil.exe并且肯定的是,Visual Studio 2010构建的输出是32位。只是为了在此处添加一些额外的价值,您可以installutil.exeC:\ Windows \ Microsoft.NET \ framework文件夹中找到最新的.NET Framework的32位版本及其相关文件。使用此版本installutil.exe修复了我的问题;该服务安装顺利!

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


我不知道您所说的32位版本是什么意思,但我在这里尝试了一下,但它既不起作用,也C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374

3

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

<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>

删除线对我有用。


在我的情况下,我想要64位版本,其中一个PropertyGroup节点缺少<PlatformTarget> x64 </ PlatformTarget>节点,因此大概它默认为32位并抛出了不良的图像格式错误。将这个缺少的节点添加到属性组后,错误消失了。
汤姆·里根

尝试此解决方案给我带来了另一个问题,尽管在输出目录中存在配置文件,但运行时未加载app.config的appSettings。但是,在尝试使用zar的方法(Processor Architecture for AnyCPU Projects)之后,一切都会重新开始。
Bizhan

1

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

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

0

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


0

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


0

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


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团队需要解决此错误。


0

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

右键单击运行网站/ Web应用程序的appPool主机,然后将启用的32位应用程序设置为false。

在此处输入图片说明


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

问题在于,每个System.BadImageFormatException: Could not load file or assembly包括与之完全无关installutil.exe的对象都指向该线程。

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

    在此处输入图片说明

  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擦干,清洗溶液并重建。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.