什么是BadImageFormatException

BadImageFormatException是当动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常。

可能的原因

如果动态链接库 (.dll 文件) 或可执行文件 (.exe 文件) 的文件格式不符合公共语言运行时所需的格式, 则会引发此异常。 具体而言, 在以下情况下会引发异常:

  • 早期版本的 .NET Framework 实用工具 (如 installutil.exe 或) 与使用 .NET Framework 的更高版本开发的程序集一起使用。

    若要解决此异常, 请使用与用于开发程序集的 .NET Framework 版本相对应的工具版本。 这可能需要修改Path环境变量或为正确的可执行文件提供完全限定的路径。

  • 尝试加载非托管动态链接库或可执行文件 (如 Windows 系统 DLL), 就像它是 .NET Framework 程序集一样。
    下面的示例通过使用Assembly.LoadFile方法加载 kernel32.dll 对此进行了说明。
    // Windows DLL (non-.NET assembly)
    string filePath = Environment.ExpandEnvironmentVariables("%windir%");
    if (! filePath.Trim().EndsWith(@"\"))
    filePath += @"\";
    filePath += @"System32\Kernel32.dll"; try {
    Assembly assem = Assembly.LoadFile(filePath);
    }
    catch (BadImageFormatException e) {
    Console.WriteLine("Unable to load {0}.", filePath);
    Console.WriteLine(e.Message.Substring(,
    e.Message.IndexOf(".") + ));
    }
    // The example displays an error message like the following:
    // Unable to load C:\WINDOWS\System32\Kernel32.dll.
    // The module was expected to contain an assembly manifest.

    若要解决此异常, 请使用您的开发语言提供的功能 (如 Visual Basic 中Declare的语句DllImportAttribute或中extern C#包含关键字的属性) 访问在 DLL 中定义的方法。

  • 尝试在非仅反射上下文中加载引用程序集。 可以通过以下两种方式之一解决此问题:
    可以加载实现程序集, 而不是引用程序集;您可以通过调用Assembly.ReflectionOnlyLoad方法在只反射上下文中加载引用程序集。
  • DLL 或可执行文件作为64位程序集加载, 但包含32位功能或资源。 例如, 它依赖于 COM 互操作或在32位动态链接库中调用方法。

    若要解决此异常, 请将项目的 "平台目标" 属性设置为 x86 (而不是 X64 或 AnyCPU) 并重新编译。

  • 应用程序的组件是使用 .NET Framework 的不同版本创建的。 通常, 在使用.NET Framework 1.0 .NET Framework 1.1或更高版本开发的应用程序或组件尝试加载使用.NET Framework 2.0 SP1或更高版本开发的程序集时, 或者当使用或尝试加载使用.NET Framework 4或更高版本开发的程序集。 .NET Framework 3.5 .NET Framework 2.0 SP1 BadImageFormatException可能会被报告为编译时错误, 或者在运行时可能会引发异常。 下面的示例定义StringLib了一个类, 该类包含一个名为 StringLib 的程序集中的成员、 ToProperCase和。
    using System;
    
    public class StringLib
    {
    private string[] exceptionList = { "a", "an", "the", "in", "on", "of" };
    private char[] separators = { ' ' }; public string ToProperCase(string title)
    {
    bool isException = false; string[] words = title.Split( separators, StringSplitOptions.RemoveEmptyEntries);
    string[] newWords = new string[words.Length]; for (int ctr = ; ctr <= words.Length - ; ctr++)
    {
    isException = false; foreach (string exception in exceptionList)
    {
    if (words[ctr].Equals(exception) && ctr > )
    {
    isException = true;
    break;
    }
    } if (! isException)
    newWords[ctr] = words[ctr].Substring(, ).ToUpper() + words[ctr].Substring();
    else
    newWords[ctr] = words[ctr];
    }
    return String.Join(" ", newWords);
    }
    }
    // Attempting to load the StringLib.dll assembly produces the following output:
    // Unhandled Exception: System.BadImageFormatException:
    //

    下面的示例使用反射加载名为 StringLib 的程序集。 如果源代码是用.NET Framework 1.1编译器编译的BadImageFormatException , 则Assembly.LoadFrom方法会引发。

    using System;
    using System.Reflection; public class Example
    {
    public static void Main()
    {
    string title = "a tale of two cities";
    // object[] args = { title}
    // Load assembly containing StateInfo type.
    Assembly assem = Assembly.LoadFrom(@".\StringLib.dll");
    // Get type representing StateInfo class.
    Type stateInfoType = assem.GetType("StringLib");
    // Get Display method.
    MethodInfo mi = stateInfoType.GetMethod("ToProperCase");
    // Call the Display method.
    string properTitle = (string) mi.Invoke(null, new object[] { title } );
    Console.WriteLine(properTitle);
    }
    }
  • 应用程序的组件面向不同的平台。 例如, 你要尝试在 x86 应用程序中加载 ARM 程序集。 您可以使用以下命令行实用程序来确定单个 .NET Framework 程序集的目标平台。 文件列表应在命令行中以空格分隔的列表形式提供。
    using System;
    using System.IO;
    using System.Reflection; public class Example
    {
    public static void Main()
    {
    String[] args = Environment.GetCommandLineArgs();
    if (args.Length == ) {
    Console.WriteLine("\nSyntax: PlatformInfo <filename>\n");
    return;
    }
    Console.WriteLine(); // Loop through files and display information about their platform.
    for (int ctr = ; ctr < args.Length; ctr++) {
    string fn = args[ctr];
    if (! File.Exists(fn)) {
    Console.WriteLine("File: {0}", fn);
    Console.WriteLine("The file does not exist.\n");
    }
    else {
    try {
    AssemblyName an = AssemblyName.GetAssemblyName(fn);
    Console.WriteLine("Assembly: {0}", an.Name);
    if (an.ProcessorArchitecture == ProcessorArchitecture.MSIL)
    Console.WriteLine("Architecture: AnyCPU");
    else
    Console.WriteLine("Architecture: {0}", an.ProcessorArchitecture); Console.WriteLine();
    }
    catch (BadImageFormatException) {
    Console.WriteLine("File: {0}", fn);
    Console.WriteLine("Not a valid assembly.\n");
    }
    }
    }
    }
    }
  • 对 C++ 可执行文件进行反射可能会引发此异常。 这极有可能是因为 C++ 编译器从可执行文件中剥离重定位地址或 .Reloc 节引起的。 若要在C++可执行文件中保留重定位地址, 请在链接时指定/fixed: no。

补充说明

  • 如果您的应用程序使用了 32 位组件,请确保该应用程序始终采用 32 位应用程序的运行方式。如果应用程序项目的**“平台目标”属性设置为 AnyCPU,则编译后的应用程序在 64 位或 32 位模式中均可运行。 如果采用 64 位应用程序运行方式,则实时 (JIT) 编译器便会生成 64 位本机代码。 如果应用程序依赖于某个 32 位托管组件或非托管组件,则在 64 位模式中无法加载该组件。 若要纠正此问题,请将项目的“平台目标”**属性设置为 x86,然后重新编译。
  • 确保未使用利用其他 .NET Framework 版本创建的组件。如果使用 .NET Framework 1.0 或 .NET Framework 1.1 开发的应用程序或组件尝试加载使用 .NET Framework 2.0 SP1 或更高版本开发的程序集,或者使用 .NET Framework 2.0 SP1 或 .NET Framework 3.5 开发的应用程序尝试加载使用 .NET Framework 4 开发的程序集,便会引发此异常。

  • 确保文件映像是有效的托管程序集或模块。当非托管动态链接库或可执行文件传递给 Load 方法进行加载时会引发此异常。
  • BadImageFormatException使用 COR_E_BADIMAGEFORMAT 值为0x8007000B 的 HRESULT。

关于System.BadImageFormatException的更多相关文章

  1. visual studio 调试时遇到 System.BadImageFormatException

    System.BadImageFormatException”类型的未经处理的异常在 未知模块. 中发生 其他信息: 未能加载文件或程序集“SendYourIP.exe”或它的某一个依赖项.生成此程序 ...

  2. System.BadImageFormatException: Could not load file or assembly

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319>InstallUtil.exe C:\_PRODUKCIJA\Debug\DynamicHtmlT ...

  3. System.BadImageFormatException : 未能加载文件或程序集“Medici.PaymentRecover, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    System.BadImageFormatException : 未能加载文件或程序集“xxxxx.xxxxx, Version=1.0.0.0, Culture=neutral, PublicKey ...

  4. 异常:System.BadImageFormatException,未能加载正确的程序集XXX

    IDE:VS2015 语言:C# 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项... 一般是由于目标程序的目标平台与其某一依赖项的目标编 ...

  5. 問題排查:System.BadImageFormatException: 未能加载文件或程序集“System.ServiceModel

    錯誤訊息如下: System.BadImageFormatException: 未能加载文件或程序集“System.ServiceModel, Version=3.0.0.0, Culture=neu ...

  6. (C#) System.BadImageFormatException: An attempt was made to load a program with an incorrect format.

    ASP.NET: System.BadImageFormatException: An attempt was made to load a program with an incorrect for ...

  7. system.badimageformatexception 未能加载文件或程序集

    今天在调用dll文件的时候发现这样一个错误.      system.badimageformatexception 未能加载文件或程序集.   发现项目CPU默认Any CPU,我的系统是X64,将 ...

  8. System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    原文 System.BadImageFormatException: 试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B) 用C#调用DLL文件,运行后报错如下: Syste ...

  9. “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确

    引用sqlite的程序集时,有时会报如下异常:  "System.BadImageFormatException"类型的未经处理的异常在 PurchaseDevices.Acces ...

  10. jexus System.BadImageFormatException Details: Non-web exception. Exception origin (name of application or object): App_global.asax_ai3fjolq.

    Application ExceptionSystem.BadImageFormatExceptionInvalid method header format 0Description: HTTP 5 ...

随机推荐

  1. python_并发与通信

    独立的进程内存空间与共享的服务器进程空间 知识点一: 进程间通信的限制 进程是独立的,互不干扰的独立内存空间我们想不能修改变量但是,深层次问题是,这个进程与那个进程完全失去了联系 import mul ...

  2. Redis Cluster: (error) MOVED

      I have a Redis cluster with the following nodes: 192.168.0.14:6379 master (slots from 0 to 16383) ...

  3. C#设计模式之11:命令模式

    C#设计模式之11:命令模式 命令模式 命令模式用来解决一些复杂业务逻辑的时候会很有用,比如,你的一个方法中到处充斥着if else 这种结构的时候,用命令模式来解决这种问题就会让事情变得简单很多. ...

  4. "Sed" 高级实用功能汇总

    sed命令有两个空间,一个叫pattern space,一个叫hold space.这两个空间能够证明人类的脑瓜容量是非常小的,需要经过大量的训练和烧脑的理解,才能适应一些非常简单的操作. 不信看下面 ...

  5. ASP.NET SignalR 系列(四)之指定对象推送

    在上一章讲到了广播推送,即所有订阅的用户都能收到,这种适合于信息广播. 接下来介绍如何给指定的对象推送 在讲这个之前先说明一下连接创建的基础知识 1.每个页面与服务端创建连接并启动时,这时服务端会产生 ...

  6. 从香农熵到手推KL散度

    信息论与信息熵是 AI 或机器学习中非常重要的概念,我们经常需要使用它的关键思想来描述概率分布或者量化概率分布之间的相似性.在本文中,我们从最基本的自信息和信息熵到交叉熵讨论了信息论的基础,再由最大似 ...

  7. Stack布局中定位的方式

    //……省略无关代码…… child: new Column( children: <Widget>[ new SizedBox(height: 20.0), new Stack( ali ...

  8. 关于定义变量名为"name"的坑!!!

    昨天下午没有什么工作可做,闲来无事就上博客园看看了,有个问题让我一直很纳闷. 直接上代码吧: 再用表达式创建函数时遇到的问题,这里的代码按照正常逻辑只有那个在变量定义后面的函数执行打印的值才是&quo ...

  9. java-springCloud环境配置

    SpringCloud注解和配置以及pom依赖说明 https://www.cnblogs.com/zhuwenjoyce/p/9663324.html https://blog.csdn.net/s ...

  10. 使用EwoMail搭建属于自己的个人邮件服务器——超详细图文教程

    版权声明:本文为CSDN博主「C_成」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_41692307 ...