BadImageFormatException Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Excepción que se produce cuando la imagen de archivo de una biblioteca de vínculos dinámicos (DLL) o un programa ejecutable no es válido.
public ref class BadImageFormatException : Exception
public ref class BadImageFormatException : SystemException
public class BadImageFormatException : Exception
[System.Serializable]
public class BadImageFormatException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class BadImageFormatException : SystemException
public class BadImageFormatException : SystemException
type BadImageFormatException = class
inherit Exception
[<System.Serializable>]
type BadImageFormatException = class
inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type BadImageFormatException = class
inherit SystemException
type BadImageFormatException = class
inherit SystemException
Public Class BadImageFormatException
Inherits Exception
Public Class BadImageFormatException
Inherits SystemException
- Herencia
- Herencia
- Atributos
Comentarios
Esta excepción se produce cuando el formato de archivo de una biblioteca de vínculos dinámicos (.dll archivo) o un archivo ejecutable (.exe archivo) no se ajusta al formato que common Language Runtime espera. En concreto, la excepción se produce en las condiciones siguientes:
Una versión anterior de una utilidad de .NET, como ILDasm.exe o installutil.exe, se usa con un ensamblado desarrollado con una versión posterior de .NET.
Para solucionar esta excepción, use la versión de la herramienta que corresponde a la versión de .NET que se usó para desarrollar el ensamblado. Esto puede requerir modificar la
Pathvariable de entorno o proporcionar una ruta de acceso completa al archivo ejecutable correcto.Está intentando cargar una biblioteca de vínculos dinámicos no administrado o ejecutable (como un archivo DLL del sistema de Windows) como si fuera un ensamblado de .NET. En el ejemplo siguiente se muestra esto mediante el Assembly.LoadFile método para cargar 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(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.open System open System.Reflection // Windows DLL (non-.NET assembly) let filePath = let filePath = Environment.ExpandEnvironmentVariables "%windir%" let filePath = if not (filePath.Trim().EndsWith @"\") then filePath + @"\" else filePath filePath + @"System32\Kernel32.dll" try Assembly.LoadFile filePath |> ignore with :? BadImageFormatException as e -> printfn $"Unable to load {filePath}." printfn $"{e.Message[0 .. e.Message.IndexOf '.']}" // The example displays an error message like the following: // Unable to load C:\WINDOWS\System32\Kernel32.dll. // Bad IL format.' Windows DLL (non-.NET assembly) Dim filePath As String = Environment.ExpandEnvironmentVariables("%windir%") If Not filePath.Trim().EndsWith("\") Then filepath += "\" filePath += "System32\Kernel32.dll" Try Dim assem As Assembly = Assembly.LoadFile(filePath) Catch e As BadImageFormatException Console.WriteLine("Unable to load {0}.", filePath) Console.WriteLine(e.Message.Substring(0, _ e.Message.IndexOf(".") + 1)) End Try ' 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.Para solucionar esta excepción, acceda a los métodos definidos en el archivo DLL mediante las características proporcionadas por el lenguaje de desarrollo, como la instrucción /
Declareen Visual Basic o el atributo DllImportAttribute con la palabra claveexternen C# y F#.Está intentando cargar un ensamblado de referencia en un contexto distinto del contexto de solo reflexión. Puede solucionar este problema de dos maneras:
- Puede cargar el ensamblado de implementación en lugar del ensamblado de referencia.
- Puede cargar el ensamblado de referencia en el contexto de solo reflexión llamando al Assembly.ReflectionOnlyLoad método .
Un archivo DLL o ejecutable se carga como un ensamblado de 64 bits, pero contiene características o recursos de 32 bits. Por ejemplo, se basa en la interoperabilidad COM o llama a métodos en una biblioteca de vínculos dinámicos de 32 bits.
Para solucionar esta excepción, establezca la propiedad de destino Platform del proyecto en x86 (en lugar de x64 o AnyCPU) y vuelva a compilarse.
Los componentes de la aplicación se crearon con diferentes versiones de .NET. Normalmente, esta excepción se produce cuando una aplicación que se desarrolló con .NET Framework 2.0 SP1 o .NET Framework 3.5 intenta cargar un ensamblado desarrollado con .NET Framework 4 o posterior. BadImageFormatException Se puede notificar como un error en tiempo de compilación o se puede producir la excepción en tiempo de ejecución. En el ejemplo siguiente se define una
StringLibclase que tiene un único miembro,ToProperCasey que reside en un ensamblado denominado StringLib.dll.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.open System module StringLib = let private exceptionList = [ "a"; "an"; "the"; "in"; "on"; "of" ] let private separators = [| ' ' |] [<CompiledName "ToProperCase">] let toProperCase (title: string) = title.Split(separators, StringSplitOptions.RemoveEmptyEntries) |> Array.mapi (fun i word -> if i <> 0 && List.contains word exceptionList then word else word[0..0].ToUpper() + word[1..]) |> String.concat " " // Attempting to load the StringLib.dll assembly produces the following output: // Unhandled Exception: System.BadImageFormatException: // The format of the file 'StringLib.dll' is invalid.Public Module StringLib Private exceptionList() As String = { "a", "an", "the", "in", "on", "of" } Private separators() As Char = { " "c } Public Function ToProperCase(title As String) As String Dim isException As Boolean = False Dim words() As String = title.Split( separators, StringSplitOptions.RemoveEmptyEntries) Dim newWords(words.Length) As String For ctr As Integer = 0 To words.Length - 1 isException = False For Each exception As String In exceptionList If words(ctr).Equals(exception) And ctr > 0 Then isException = True Exit For End If Next If Not isException Then newWords(ctr) = words(ctr).Substring(0, 1).ToUpper() + words(ctr).Substring(1) Else newWords(ctr) = words(ctr) End If Next Return String.Join(" ", newWords) End Function End ModuleEn el ejemplo siguiente se usa la reflexión para cargar un ensamblado denominado StringLib.dll. Si el código fuente se compila con un compilador de .NET Framework 1.1, el método BadImageFormatException inicia una BadImageFormatException.
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); } }open System.Reflection let title = "a tale of two cities" // Load assembly containing StateInfo type. let assem = Assembly.LoadFrom @".\StringLib.dll" // Get type representing StateInfo class. let stateInfoType = assem.GetType "StringLib" // Get Display method. let mi = stateInfoType.GetMethod "ToProperCase" // Call the Display method. let properTitle = mi.Invoke(null, [| box title |]) :?> string printfn $"{properTitle}"Imports System.Reflection Module Example Public Sub Main() Dim title As String = "a tale of two cities" ' Load assembly containing StateInfo type. Dim assem As Assembly = Assembly.LoadFrom(".\StringLib.dll") ' Get type representing StateInfo class. Dim stateInfoType As Type = assem.GetType("StringLib") ' Get Display method. Dim mi As MethodInfo = stateInfoType.GetMethod("ToProperCase") ' Call the Display method. Dim properTitle As String = CStr(mi.Invoke(Nothing, New Object() { title } )) Console.WriteLine(properTitle) End Sub End Module ' Attempting to load the StringLib.dll assembly produces the following output: ' Unhandled Exception: System.BadImageFormatException: ' The format of the file 'StringLib.dll' is invalid.Para solucionar esta excepción, asegúrese de que el ensamblado cuyo código se está ejecutando y que produce la excepción y el ensamblado que se va a cargar, ambas versiones compatibles de destino de .NET.
Los componentes de la aplicación tienen como destino distintas plataformas. Por ejemplo, está intentando cargar ensamblados arm en una aplicación x86. Puede usar la siguiente utilidad de línea de comandos para determinar las plataformas de destino de ensamblados individuales de .NET. La lista de archivos debe proporcionarse como una lista delimitada por espacios en la línea de comandos.
using System; using System.IO; using System.Reflection; public class Example { public static void Main() { String[] args = Environment.GetCommandLineArgs(); if (args.Length == 1) { Console.WriteLine("\nSyntax: PlatformInfo <filename>\n"); return; } Console.WriteLine(); // Loop through files and display information about their platform. for (int ctr = 1; 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"); } } } } }open System open System.IO open System.Reflection let args = Environment.GetCommandLineArgs() if args.Length = 1 then printfn "\nSyntax: PlatformInfo <filename>\n" else printfn "" // Loop through files and display information about their platform. for i = 1 to args.Length - 1 do let fn = args[i] if not (File.Exists fn) then printfn $"File: {fn}" printfn "The file does not exist.\n" else try let an = AssemblyName.GetAssemblyName fn printfn $"Assembly: {an.Name}" if an.ProcessorArchitecture = ProcessorArchitecture.MSIL then printfn "Architecture: AnyCPU" else printfn $"Architecture: {an.ProcessorArchitecture}" printfn "" with :? BadImageFormatException -> printfn $"File: {fn}" printfn "Not a valid assembly.\n"Imports System.IO Imports System.Reflection Module Example Public Sub Main() Dim args() As String = Environment.GetCommandLineArgs() If args.Length = 1 Then Console.WriteLine() Console.WriteLine("Syntax: PlatformInfo <filename> ") Console.WriteLine() Exit Sub End If Console.WriteLine() ' Loop through files and display information about their platform. For ctr As Integer = 1 To args.Length - 1 Dim fn As String = args(ctr) If Not File.Exists(fn) Then Console.WriteLine("File: {0}", fn) Console.WriteLine("The file does not exist.") Console.WriteLine() Else Try Dim an As AssemblyName = AssemblyName.GetAssemblyName(fn) Console.WriteLine("Assembly: {0}", an.Name) If an.ProcessorArchitecture = ProcessorArchitecture.MSIL Then Console.WriteLine("Architecture: AnyCPU") Else Console.WriteLine("Architecture: {0}", an.ProcessorArchitecture) End If Catch e As BadImageFormatException Console.WriteLine("File: {0}", fn) Console.WriteLine("Not a valid assembly.\n") End Try Console.WriteLine() End If Next End Sub End ModuleLa reflexión en los archivos ejecutables de C++ podría producir esta excepción. Esto es más probable que se deba a que el compilador de C++ despoja las direcciones de reubicación o . Vuelva a asignar la sección del archivo ejecutable. Para conservar la dirección .relocation en un archivo ejecutable de C++, especifique /fixed:no al vincular.
BadImageFormatException usa HRESULT COR_E_BADIMAGEFORMAT, que tiene el valor 0x8007000B.
Para obtener una lista de valores de propiedad iniciales para una instancia de BadImageFormatException, vea los BadImageFormatException constructores.
Constructores
| Nombre | Description |
|---|---|
| BadImageFormatException() |
Inicializa una nueva instancia de la clase BadImageFormatException. |
| BadImageFormatException(SerializationInfo, StreamingContext) |
Inicializa una nueva instancia de la BadImageFormatException clase con datos serializados. |
| BadImageFormatException(String, Exception) |
Inicializa una nueva instancia de la BadImageFormatException clase con un mensaje de error especificado y una referencia a la excepción interna que es la causa de esta excepción. |
| BadImageFormatException(String, String, Exception) |
Inicializa una nueva instancia de la BadImageFormatException clase con un mensaje de error especificado y una referencia a la excepción interna que es la causa de esta excepción. |
| BadImageFormatException(String, String) |
Inicializa una nueva instancia de la BadImageFormatException clase con un mensaje de error y un nombre de archivo especificados. |
| BadImageFormatException(String) |
Inicializa una nueva instancia de la BadImageFormatException clase con un mensaje de error especificado. |
Propiedades
| Nombre | Description |
|---|---|
| Data |
Obtiene una colección de pares clave-valor que proporcionan información adicional definida por el usuario sobre la excepción. (Heredado de Exception) |
| FileName |
Obtiene el nombre del archivo que provoca esta excepción. |
| FusionLog |
Obtiene el archivo de registro que describe por qué se produjo un error en la carga de un ensamblado. |
| HelpLink |
Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción. (Heredado de Exception) |
| HResult |
Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica. (Heredado de Exception) |
| InnerException |
Obtiene la Exception instancia que provocó la excepción actual. (Heredado de Exception) |
| Message |
Obtiene el mensaje de error y el nombre del archivo que provocó esta excepción. |
| Source |
Obtiene o establece el nombre de la aplicación o el objeto que provoca el error. (Heredado de Exception) |
| StackTrace |
Obtiene una representación de cadena de los fotogramas inmediatos en la pila de llamadas. (Heredado de Exception) |
| TargetSite |
Obtiene el método que produce la excepción actual. (Heredado de Exception) |
Métodos
| Nombre | Description |
|---|---|
| Equals(Object) |
Determina si el objeto especificado es igual al objeto actual. (Heredado de Object) |
| GetBaseException() |
Cuando se reemplaza en una clase derivada, devuelve la Exception causa principal de una o varias excepciones posteriores. (Heredado de Exception) |
| GetHashCode() |
Actúa como la función hash predeterminada. (Heredado de Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Establece el objeto con el nombre de SerializationInfo archivo, el registro de caché de ensamblados y la información adicional de excepciones. |
| GetType() |
Obtiene el tipo de tiempo de ejecución de la instancia actual. (Heredado de Exception) |
| MemberwiseClone() |
Crea una copia superficial del Objectactual. (Heredado de Object) |
| ToString() |
Devuelve el nombre completo de esta excepción y, posiblemente, el mensaje de error, el nombre de la excepción interna y el seguimiento de la pila. |
Eventos
| Nombre | Description |
|---|---|
| SerializeObjectState |
Se produce cuando se serializa una excepción para crear un objeto de estado de excepción que contiene datos serializados sobre la excepción. (Heredado de Exception) |