System.BadImageFormatException 类

方法描述

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

语法定义(C# System.BadImageFormatException 类 的用法)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class BadImageFormatException : SystemException

构造函数

构造函数名称 构造函数描述
BadImageFormatException() 初始化 BadImageFormatException 类的新实例。
BadImageFormatException(String) 用指定的错误消息初始化 BadImageFormatException 类的新实例。
BadImageFormatException(SerializationInfo, StreamingContext) 用序列化数据初始化 BadImageFormatException 类的新实例。
BadImageFormatException(String, Exception) 使用指定错误消息和对作为此异常原因的内部异常的引用来初始化 BadImageFormatException 类的新实例。
BadImageFormatException(String, String) 用指定的错误消息和文件名初始化 BadImageFormatException 类的新实例。
BadImageFormatException(String, String, Exception) 使用指定错误消息和对作为此异常原因的内部异常的引用来初始化 BadImageFormatException 类的新实例。

成员/方法

方法名称 方法描述
Equals(Object) 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
GetBaseException 当在派生类中重写时,返回 Exception,它是一个或多个并发的异常的根源。 (继承自 Exception。)
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetObjectData 用文件名、程序集缓存日志和其他异常信息设置 SerializationInfo 对象。 (重写 Exception.GetObjectData(SerializationInfo, StreamingContext)。)
GetType 获取当前实例的运行时类型。 (继承自 Exception。) 在 XNA Framework3.0GetType()。 在 GetType()。
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
ToString 返回该异常的完全限定名,还可能返回错误消息、内部异常的名称和堆栈跟踪。 (重写 Exception.ToString()。) 在 XNA Framework 中,此成员由 ToString() 重写。 在 中,此成员由 ToString() 重写。

提示和注释

当动态链接库(.dll 文件)或可执行文件(.exe 文件)的文件格式不符合公共语言运行库的预期格式时,将引发此异常。 尤其是当出现以下情况时将会引发异常:

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

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

尝试加载非托管的动态链接库或可执行文件(如 Windows 系统 DLL),就好像这是 .NET Framework 程序集。 下面的示例通过使用 Assembly.LoadFile 方法加载 Kernel32.dll 来对此进行阐释。

C#

VB

复制

// 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(0,

e.Message.IndexOf(".") + 1));

}

// 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 语句或 C# 中的 DllImportAttribute 特性和 extern 关键字),来访问在 DLL 中定义的方法。

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 2.0 SP1 .NET Framework 3.5 开发的应用程序尝试加载使用 .NET Framework 4 开发的程序集时,会发生此异常。 BadImageFormatException 可能会报告作为编译时错误,或在运行时可能会引发该异常。 下面的示例阐释此方案。 它定义了具有一个成员 ToProperCase 并驻留在名为 StringLib.dll 程序集中的 StringLib 类。

C#

VB

复制

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 = 0; ctr <= words.Length - 1; ctr++)

{

isException = false;

foreach (string exception in exceptionList)

{

if (words[ctr].Equals(exception) && ctr > 0)

{

isException = true;

break;

}

}

if (! isException)

newWords[ctr] = words[ctr].Substring(0, 1).ToUpper() + words[ctr].Substring(1);

else

newWords[ctr] = words[ctr];

}

return String.Join(" ", newWords);

}

}

// Attempting to load the StringLib.dll assembly produces the following output:

// Unhandled Exception: System.BadImageFormatException:

// The format of the file 'StringLib.dll' is invalid.

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

C#

VB

复制

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);

}

}

若要解决此异常,请确保引发该异常的程序集尝试加载用兼容版本的 .NET Framework 开发的程序集。

BadImageFormatException 使用值为 0x8007000B 的 HRESULT COR_E_BADIMAGEFORMAT。

有关 BadImageFormatException 实例的初始属性值列表,请参见 BadImageFormatException 构造函数。

System.BadImageFormatException 类例子


继承层次结构

System.Object

System.Exception

System.SystemException

System.BadImageFormatException

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。