Leer en inglés

Compartir a través de


BadImageFormatException Clase

Definición

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álida.

C#
public class BadImageFormatException : Exception
C#
public class BadImageFormatException : SystemException
C#
[System.Serializable]
public class BadImageFormatException : SystemException
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class BadImageFormatException : SystemException
Herencia
BadImageFormatException
Herencia
BadImageFormatException
Atributos

Comentarios

Esta excepción se produce cuando el formato de archivo de una biblioteca de vínculos dinámicos (archivo .dll) 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 que se desarrolló 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 variable de Path entorno o proporcionar una ruta de acceso completa al 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.

    C#
    // 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.
    

    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 Declare instrucción en Visual Basic o el DllImportAttribute atributo con la extern palabra clave en 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 compilar.

  • Los componentes de la aplicación se crearon con diferentes versiones de .NET. Normalmente, esta excepción se produce cuando una aplicación o componente que se desarrolló mediante .NET Framework 1.0 o .NET Framework 1.1 intenta cargar un ensamblado que se desarrolló con .NET Framework 2.0 SP1 o posterior, o cuando una aplicación desarrollada con .NET Framework 2.0 SP1 o .NET Framework 3.5 intenta cargar un ensamblado que se desarrolló con .NET Framework 4 o posterior. BadImageFormatException puede notificarse 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 StringLib clase que tiene un único miembro, ToProperCasey que reside en un ensamblado denominado StringLib.dll.

    C#
    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.
    

    En 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 Assembly.LoadFrom método inicia una BadImageFormatException excepción .

    C#
    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);
       }
    }
    

    Para solucionar esta excepción, asegúrese de que el ensamblado cuyo código se está ejecutando y que inicia 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 .NET individuales. La lista de archivos debe proporcionarse como una lista delimitada por espacios en la línea de comandos.

    C#
    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");
                }
             }
          }
       }
    }
    
  • Esta excepción se puede producir al reflejar en archivos ejecutables de C++. Lo más probable es que se deba a que el compilador de C++ ha eliminado las direcciones de reubicación o la sección .Reloc del archivo ejecutable. Para conservar la dirección de reubicación 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 de una instancia de BadImageFormatException, consulte el BadImageFormatException constructores.

Constructores

BadImageFormatException()

Inicializa una nueva instancia de la clase BadImageFormatException.

BadImageFormatException(SerializationInfo, StreamingContext)

Inicializa una nueva instancia de la clase BadImageFormatException con datos serializados.

BadImageFormatException(String)

Inicializa una nueva instancia de la clase BadImageFormatException con el mensaje de error especificado.

BadImageFormatException(String, Exception)

Inicializa una nueva instancia de la clase BadImageFormatException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción.

BadImageFormatException(String, String)

Inicializa una nueva instancia de la clase BadImageFormatException con el mensaje de error y el nombre de archivo especificados.

BadImageFormatException(String, String, Exception)

Inicializa una nueva instancia de la clase BadImageFormatException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción.

Propiedades

Data

Obtiene una colección de pares clave/valor que proporciona información definida por el usuario adicional sobre la excepción.

(Heredado de Exception)
FileName

Obtiene el nombre del archivo que causa esta excepción.

FusionLog

Obtiene el archivo de registro que describe el motivo por el que no se pudo cargar 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 instancia Exception que produjo la excepción actual.

(Heredado de Exception)
Message

Obtiene el mensaje de error y el nombre del archivo que causó esta excepción.

Source

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.

(Heredado de Exception)
StackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.

(Heredado de Exception)
TargetSite

Obtiene el método que produjo la excepción actual.

(Heredado de Exception)

Métodos

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetBaseException()

Cuando se invalida en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores.

(Heredado de Exception)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetObjectData(SerializationInfo, StreamingContext)

Establece el objeto SerializationInfo con el nombre del archivo, el registro de la caché de ensamblados y la información adicional de la excepción.

GetObjectData(SerializationInfo, StreamingContext)

Cuando se invalida en una clase derivada, establece SerializationInfo con información sobre la excepción.

(Heredado de Exception)
GetType()

Obtiene el tipo de tiempo de ejecución de la instancia actual.

(Heredado de Exception)
MemberwiseClone()

Crea una copia superficial del Object actual.

(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

SerializeObjectState
Obsoletos.

Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción.

(Heredado de Exception)

Se aplica a

Producto Versiones
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Consulte también