115

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

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

是什么赋予了?


编辑:(不是由 OP)从 dup 中提取的完整消息获得更多点击 [for 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”或其依赖项之一。试图加载格式不正确的程序..

4

16 回答 16

163

一些更完整的细节,以防它帮助某人......

请注意,目前此异常的最常见原因是尝试将 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 文件的版本号。

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

System.BadImageFormatException 的完整细节(说唯一的原因是不匹配的咬痕真的是过于简单化了!)。

x64安装程序BadImageFormatException下的另一个原因是,在 Visual Studio 2010 中,默认安装项目类型会生成 32 位shim,即使在 x64 系统上也是如此(搜索“64 位托管自定义操作引发 System.BadImageFormatException 异常”这页纸)。.vdprojInstallUtilLib

于 2010-01-29T09:18:32.567 回答
16

确保最新的框架(您编译应用程序时使用的框架)位于 PATH 的第一位。这为我解决了问题。(在论坛上找到)

于 2008-11-27T07:39:28.113 回答
15

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

在此处输入图像描述

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

在此处输入图像描述

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

更新 - 对于 VS2019:

在此处输入图像描述

于 2019-05-15T19:51:10.883 回答
9

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

C:\Windows\Microsoft.NET\Framework\v4.0.30319

它应该可以很好地安装您的 32 位应用程序。

于 2013-07-05T07:35:55.120 回答
7

好的,这就是我遇到的问题,而且,修复它的方法似乎与上述内容非常相关。

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

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

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

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

Ruben对 Visual Studio 2010 的 32 位输出的上述观察是这里的救星。

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

我希望这对其他人有帮助。

于 2013-01-23T08:43:57.510 回答
6

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

  1. 右键单击项目
  2. 选择属性
  3. 勾选“首选 32 位”
  4. 平台目标:任何 CPU
于 2018-12-31T08:21:48.963 回答
4

在尝试了所有提到的解决方案后,我发现在我的项目 .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>

删除线路对我有用。

于 2018-08-15T06:49:38.553 回答
3

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

cd\
cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
installutil.exe "C:\XXX\Bin\ABC.exe"
pause
于 2020-12-28T18:14:05.627 回答
1

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

于 2019-03-13T09:12:02.647 回答
0

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

于 2016-01-27T11:57:08.663 回答
0

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

于 2016-10-06T00:27:20.307 回答
0

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

于 2018-03-20T20:07:46.733 回答
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 团队解决。

于 2018-12-28T22:08:29.870 回答
0

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

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

在此处输入图像描述

于 2019-01-18T19:50:28.363 回答
0

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

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

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

于 2019-05-10T16:13:29.520 回答
0

问题是,每一个System.BadImageFormatException: Could not load file or assembly包括那些根本不相关installutil.exe的都指向这个线程。

  1. 如果您的问题与 dll 相关WindowsBase并且PresentationFramework 您安装了分析器,请确保为您的解决方案中的所有项目安装它们,或者不为它们安装。

    在此处输入图像描述

  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目录,清理解决方案并重建。

于 2019-12-05T21:46:37.997 回答