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

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

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

怎么了?


编辑: (不是由 OP)从摘要中提取的完整消息获得了更多的点击量[对于谷歌可用性] :

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

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

152894 次浏览

Make sure the newest Framework (the one you compiled your app with) is first in the PATH. That solved the problem for me. (Found 在论坛上)

一些更详细的完整性,以防它帮助别人..。

请注意,这种异常现在最常见的原因是试图将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 Framework64 v2.0.50727 installutil.exe

将无法工作(在其他框架版本中替换: v1.1.4322(仅32位,所以不会出现这个问题)和 v4.0.30319,如上所述)。

显然,正如在另一个答案中所介绍的那样,一个人还需要。NET 版本号的 installutil,你运行的是 > = (最好 =)的 EXE/DLL 文件,你运行的安装程序。

Finally, note that in Visual Studio 2010, the tooling will default to generating x86 binaries (rather than Any CPU as previously).

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

X64安装程序下使用 BadImageFormatException的另一个原因是 在 Visual Studio 2010中,默认的 ABC1 Install Project 类型即使在 x64系统上也会生成一个32位的 InstallUtilLib垫片,< strong > (搜索“64位托管自定义操作抛出系统”。“ BadImageFormatException 异常”)。

好的,这就是我遇到的问题,解决这个问题的方法,似乎与上述问题非常相关。

我正在使用 VisualStudio2010Express。我写了一个测试服务,实际上没有做任何事情。只是为了以后的实战做练习。

我编写了这个服务,并试图使用 installutil.exe安装它,但是得到了以下错误:

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

目前为止和原作者一样。

Ruben 上面关于 Visual Studio 201032位输出的观察是这里的救星。

I used the 64-bit version of the installutil.exe and sure enough, the output of the Visual Studio 2010 build was 32-bit. Just to add a little extra value here, you can find the 32-bit version of the latest .NET framework and the associated installutil.exe in the C: Windows Microsoft.NET 框架 folder. Using this version of the installutil.exe fixed my problem; the service installed without a hitch!

我希望这能帮到其他人。

我认为你正在使用64位版本的工具来安装一个32位应用程序。 我今天也遇到了这个问题,并使用这个 Framework 路径来迎合。

C: Windows Microsoft.NET Framework v4.0.30319

and it should install your 32-bit application just fine.

I had the same issue. I using the standard command for execution. It was calling the X64 ro run against X86 tests. I needed to specify the X86 and not the X64 version of the nunit-runner.

总之,为了在64位系统上成功安装64位服务,Build 和 ProjectBuild Platform 都必须设置为 x64。

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

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

移除这条线对我来说很管用。

如果在 现场测试中有此消息,但在 不是在单元测试中中有此消息,那是因为选定的程序集被动态复制到 $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\。但有时很少的程序集可以是 没被选中,例如,在互操作 c + +/c # 项目的情况下,VC + + dls。

Post-build xcopy won't correct the problem, because the copied file will be erased by the live test engine.

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

这个 bug 可以在任何 Visual Studio 2017到15.9.4中看到,需要由 Visual Studio 团队解决。

I had this issue with a WinForms Project using VS 2015. My solution was:

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

托管 IIS64位的目标服务器

右键单击运行网站/web 应用程序的 appPool 宿主,并设置 启用32位应用程序 = false。

enter image description here

我今天已经面对了这个问题。在我的例子中,我的应用程序的 (引用了64位 dll)平台目标被设置为 AnyCPU,但是默认情况下平台目标部分下的 Prefer 32-bit 复选框被打勾。这就是问题所在,在取消检查 Prefer 32-bit选项之后,一切正常。

我们找到了解决同样症状问题的不同方法:

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

The problem was that even though we were not referencing System.Net.Http any more in the project, it was listed in the dependentAssembily section of our web.config. Removing this and any other unused assembly references from the web.config solved the problem.

关键是为项目设置匹配处理器设置,这些设置位于两个位置。

enter image description here

并且确保在 Test menu > > Test Settings > > Default Processor Architecture > > > 中的体系结构设置是相同的,如下所示。

enter image description here

这是为 VS2013,但也许同样为其他版本。

更新-VS2019:

enter image description here

The problem is that every System.BadImageFormatException: Could not load file or assembly including the ones not associated with installutil.exe at all point to this very thread.

  1. 如果您的问题与 WindowsBasePresentationFramework有关 Dlls 和安装了分析器的您确保要么有它们 为解决方案中的所有项目安装,或者不为任何项目安装 他们。

    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. Remove bin and obj dirs, clean solution and rebuild.

在我的例子中,我使用了 Framework64,如下所示

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

我发现 C: Windows Microsoft.NET Framework v4.0.30319目录中 InstallUtil.exe = 0 KB 的大小。我从另一台服务器替换了 InstallUtil.exe,我可以安装这个服务。