【问题标题】:System.BadImageFormatException: Could not load file or assembly (from installutil.exe)System.BadImageFormatException:无法加载文件或程序集(来自 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”或其依赖项之一。试图加载格式不正确的程序..

【问题讨论】:

    标签: .net windows-services x86 64-bit x86-64


    【解决方案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

    【讨论】:

    【解决方案3】:

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

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

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

    更新 - 对于 VS2019:

    【讨论】:

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

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

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

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

    【讨论】:

    【解决方案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 项目中遇到了这个问题。我的解决方案是:

    1. 右键单击项目
    2. 选择属性
    3. 勾选“首选 32 位”
    4. 平台目标:任何 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 无关的都指向这个线程。

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

                      【讨论】:

                        猜你喜欢
                        • 2019-02-11
                        • 1970-01-01
                        • 2011-07-10
                        • 2013-05-15
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-02-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多