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

Posted

技术标签:

【中文标题】System.BadImageFormatException:无法加载文件或程序集(来自 installutil.exe)【英文标题】:System.BadImageFormatException: Could not load file or assembly (from installutil.exe) 【发布时间】:2010-09-24 07:13:42 【问题描述】:

我正在尝试使用 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) 微软公司。保留所有权利。

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

【问题讨论】:

【参考方案1】:

更多细节以确保对某人有帮助...

请注意,最近出现此异常的最常见原因是尝试将 32 位特定 (/platform:x86) DLL 加载到 64 位进程中,反之亦然(即加载 64 位特定 (@ 987654326@) 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,如上文所述)。

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

最后,请注意in Visual Studio 2010, the tooling will default to generating x86 binaries (rather 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 异常”)。

【讨论】:

我有同样的问题,当我按照你上面说的开始调试时,我发现 Platform: 设置为 x86。当我将它更改为任何 CPU 时,它工作了:) 我的 Windows 安装程序带有自定义操作。我的设置需要在 x64 系统上运行,因此自定义操作属性必须检查选项“Run64Bit”是否为真。它解决了我的问题。【参考方案2】:

确保最新的框架(您编译应用时使用的框架)位于 PATH 的第一位。这为我解决了问题。 (发现on a forum)

【讨论】:

那个链接好像没了。不过也不算太意外。 6 年前。 这里是 Archive.org web.archive.org/web/20100527204545/http://www.issociate.de/… 我希望如果他们向我们展示他们设置的 PATH 会更好。从过去的 2 小时开始,我一直在努力解决这个问题...【参考方案3】:

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

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

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

更新 - 对于 VS2019:

【讨论】:

这是修复此错误的正确方法。也就是说,如果您不想弄乱可能有数百个 csproj 文件。【参考方案4】:

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

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

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

【讨论】:

对我来说就是这样。很有帮助的答案。 至少链接原答案:***.com/revisions/5229405/1【参考方案5】:

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

我正在使用 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 文件夹中找到最新的 .NET 框架的 32 位版本和关联的installutil.exe。使用这个版本的installutil.exe 解决了我的问题;服务安装顺利!

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

【讨论】:

我不知道您所说的 32 位版本是什么意思,但我在这里尝试过,它也不起作用 C:\Windows\Microsoft.NET\Framework\v2.0.50727跨度> 【参考方案6】:

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

    右键单击项目 选择属性 勾选“首选 32 位” 平台目标:任何 CPU

【讨论】:

【参考方案7】:

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

删除线对我有用。

【讨论】:

在我想要 64 位构建的情况下,PropertyGroup 节点之一缺少 x64 节点,因此推测它默认为 32 位并抛出错误图像格式错误。一旦我将这个缺失的节点添加到属性组,错误就消失了。 尝试这个解决方案给我带来了另一个问题,即 尽管配置文件存在于输出目录中,但在运行时没有加载 app.config 的 appSettings。然而,在尝试了 zar 的方法 (Processor Architecture for AnyCPU Projects) 之后,一切又开始工作了。 谢谢你,我在“属性”窗口中将它设置为 x86,但是当我查看 csproj 文件时,它是 AnyCPU。将其切换到 x86 解决了我的问题【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

如果在实时测试中出现此消息,但在单元测试中没有,这是因为选定的程序集被即时复制到$(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 团队解决。

【讨论】:

【参考方案14】:

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

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

【讨论】:

【参考方案15】:

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

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

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

【讨论】:

【参考方案16】:

问题是每个System.BadImageFormatException: Could not load file or assembly 包括那些与installutil.exe 无关的都指向这个线程。

    如果您的问题与WindowsBasePresentationFramework 有关 dll 并且您安装了分析器,请确保安装它们 为您解决方案中的所有项目安装或没有安装 他们。

    在您的库的.csproj 文件中引用整个框架,而不仅仅是两个dlls

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
    

    删除 binobj 目录,清理解决方案并重建。

【讨论】:

以上是关于System.BadImageFormatException:无法加载文件或程序集(来自 installutil.exe)的主要内容,如果未能解决你的问题,请参考以下文章