BadImageFormatException Klasa

Definicja

Wyjątek, który jest generowany, gdy obraz pliku biblioteki dołączanej dynamicznie (DLL) lub program wykonywalny jest nieprawidłowy.The exception that is thrown when the file image of a dynamic link library (DLL) or an executable program is invalid.

public ref class BadImageFormatException : SystemException
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class BadImageFormatException : SystemException
type BadImageFormatException = class
    inherit SystemException
Public Class BadImageFormatException
Inherits SystemException
Dziedziczenie
BadImageFormatException
Atrybuty

Uwagi

Ten wyjątek jest zgłaszany, gdy format pliku biblioteki dołączanej dynamicznie (plik. dll) lub plik wykonywalny (. exe) nie jest zgodny z formatem, którego oczekuje środowisko uruchomieniowe języka wspólnego.This exception is thrown when the file format of a dynamic link library (.dll file) or an executable (.exe file) doesn't conform to the format that the common language runtime expects. W szczególności wyjątek jest zgłaszany w następujących warunkach:In particular, the exception is thrown under the following conditions:

  • Starsza wersja narzędzia .NET Framework, na przykład ILDasm. exe lub Installutil. exe, jest używana z zestawem, który został opracowany przy użyciu nowszej wersji .NET Framework.An earlier version of a .NET Framework utility, such as ILDasm.exe or installutil.exe, is used with an assembly that was developed with a later version of the .NET Framework.

    Aby rozwiązać ten wyjątek, użyj wersji narzędzia, która odnosi się do wersji .NET Framework, która została użyta do opracowania zestawu.To address this exception, use the version of the tool that corresponds to the version of the .NET Framework that was used to develop the assembly. Może to wymagać zmodyfikowania Path zmiennej środowiskowej lub udostępnienia w pełni kwalifikowanej ścieżki do poprawnego pliku wykonywalnego.This may require modifying the Path environment variable or providing a fully qualified path to the correct executable.

  • Próbujesz załadować niezarządzaną bibliotekę dołączaną dynamicznie lub plik wykonywalny (np. system Windows DLL) tak, jakby był to zestaw .NET Framework.You are trying to load an unmanaged dynamic link library or executable (such as a Windows system DLL) as if it were a .NET Framework assembly. Poniższy przykład ilustruje to przy użyciu Assembly.LoadFile metody ładowania pliku Kernel32. dll.The following example illustrates this by using the Assembly.LoadFile method to load 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.
    
    ' 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.
    

    Aby rozwiązać ten wyjątek, uzyskaj dostęp do metod zdefiniowanych w bibliotece DLL przy użyciu funkcji dostępnych w języku Declare deweloperskim, takich jak instrukcja w Visual Basic DllImportAttribute lub atrybut ze extern słowem kluczowym w C#.To address this exception, access the methods defined in the DLL by using the features provided by your development language, such as the Declare statement in Visual Basic or the DllImportAttribute attribute with the extern keyword in C#.

  • Próbujesz załadować zestaw referencyjny w kontekście innym niż kontekst tylko odbicie.You are trying to load a reference assembly in a context other than the reflection-only context. Ten problem można rozwiązać na dwa sposoby:You can address this issue in either of two ways:

    • Można załadować zestaw implementacji, a nie zestaw referencyjny.You can load the implementation assembly rather than the reference assembly.
    • Zestaw odwołań można załadować w kontekście tylko odbicia przez wywołanie Assembly.ReflectionOnlyLoad metody.You can load the reference assembly in the reflection-only context by calling the Assembly.ReflectionOnlyLoad method.
  • Biblioteka DLL lub plik wykonywalny jest ładowany jako zestaw 64-bitowy, ale zawiera ona 32-bitowe funkcje lub zasoby.A DLL or executable is loaded as a 64-bit assembly, but it contains 32-bit features or resources. Na przykład zależy on od międzyoperacyjności modelu COM lub wywołuje metody w 32-bitowej bibliotece dołączanej dynamicznie.For example, it relies on COM interop or calls methods in a 32-bit dynamic link library.

    Aby rozwiązać ten wyjątek, należy ustawić właściwość Target platformy projektu na x86 (zamiast x64 lub AnyCPU) i ponownie skompilować.To address this exception, set the project's Platform target property to x86 (instead of x64 or AnyCPU) and recompile.

  • Składniki aplikacji zostały utworzone przy użyciu różnych wersji .NET Framework.Your application's components were created using different versions of the .NET Framework. Zazwyczaj ten wyjątek występuje, gdy aplikacja lub składnik, który został opracowany przy użyciu .NET Framework 1.0.NET Framework 1.0 .NET Framework 1.1.NET Framework 1.1 lub próbuje załadować zestaw .NET Framework 2.0 z dodatkiem SP1.NET Framework 2.0 SP1 , który został opracowany przy użyciu lub później, lub gdy aplikacja, która została opracowana przy użyciu lub próbuje załadować zestaw Program .NET Framework 4.NET Framework 4 , który został opracowany przy użyciu lub później. Program .NET Framework 3,5.NET Framework 3.5 .NET Framework 2.0 z dodatkiem SP1.NET Framework 2.0 SP1Typically, this exception occurs when an application or component that was developed using the .NET Framework 1.0.NET Framework 1.0 or the .NET Framework 1.1.NET Framework 1.1 tries to load an assembly that was developed using the .NET Framework 2.0 z dodatkiem SP1.NET Framework 2.0 SP1 or later, or when an application that was developed using the .NET Framework 2.0 z dodatkiem SP1.NET Framework 2.0 SP1 or Program .NET Framework 3,5.NET Framework 3.5 tries to load an assembly that was developed using the Program .NET Framework 4.NET Framework 4 or later. BadImageFormatException Może być zgłaszany jako błąd w czasie kompilacji lub wyjątek może być zgłaszany w czasie wykonywania.The BadImageFormatException may be reported as a compile-time error, or the exception may be thrown at run time. W poniższym przykładzie zdefiniowano StringLib klasę, która ma pojedynczy element członkowski ToProperCase, i znajduje się w zestawie o nazwie StringLib. dll.The following example defines a StringLib class that has a single member, ToProperCase, and that resides in an assembly named 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.
    
    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 Module
    

    Poniższy przykład używa odbicia w celu załadowania zestawu o nazwie StringLib. dll.The following example uses reflection to load an assembly named StringLib.dll. Jeśli kod źródłowy jest kompilowany za pomocą .NET Framework 1.1.NET Framework 1.1 kompilatora BadImageFormatException , Assembly.LoadFrom Metoda jest zgłaszana przez metodę.If the source code is compiled with a .NET Framework 1.1.NET Framework 1.1 compiler, a BadImageFormatException is thrown by the Assembly.LoadFrom method.

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

    Aby rozwiązać ten wyjątek, upewnij się, że zestaw, którego kod jest wykonywany i który zgłasza wyjątek, oraz zestaw do załadowania obu docelowych zgodnych wersji .NET Framework.To address this exception, make sure that the assembly whose code is executing and that throws the exception, and the assembly to be loaded both target compatible versions of the .NET Framework.

  • Składniki aplikacji są przeznaczone dla różnych platform.The components of your application target different platforms. Na przykład próbujesz załadować zestawy ARM w aplikacji x86.For example, you are trying to load ARM assemblies in an x86 application. Aby określić platformę docelową poszczególnych zestawów .NET Framework, można użyć następującego narzędzia wiersza polecenia.You can use the following command-line utility to determine the target platforms of individual .NET Framework assemblies. Listę plików należy podać jako listę rozdzielaną spacjami w wierszu polecenia.The list of files should be provided as a space-delimited list at the command line.

    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");
                }
             }
          }
       }
    }
    
    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 Module
    
  • Odbicie w C++ plikach wykonywalnych może zgłosić ten wyjątek.Reflecting on C++ executable files may throw this exception. Najprawdopodobniej jest to spowodowane tym C++ , że kompilator usuwa adresy relokacji lub. Sekcja RELOC z pliku wykonywalnego.This is most likely caused by the C++ compiler stripping the relocation addresses or the .Reloc section from the executable file. Aby zachować adres. relokację w pliku C++ wykonywalnym, należy określić/FIXED: No podczas konsolidacji.To preserve the .relocation address in a C++ executable file, specify /fixed:no when linking.

BadImageFormatExceptionużywa HRESULT COR_E_BADIMAGEFORMAT o wartości 0x8007000B.BadImageFormatException uses the HRESULT COR_E_BADIMAGEFORMAT, which has the value 0x8007000B.

Aby uzyskać listę początkowe wartości właściwości wystąpienia BadImageFormatException, zobacz BadImageFormatException konstruktorów.For a list of initial property values for an instance of BadImageFormatException, see the BadImageFormatException constructors.

Konstruktory

BadImageFormatException()

Inicjuje nowe wystąpienie klasy BadImageFormatException klasy.Initializes a new instance of the BadImageFormatException class.

BadImageFormatException(SerializationInfo, StreamingContext)

Inicjuje nowe wystąpienie klasy BadImageFormatException klasy z serializowanych danych.Initializes a new instance of the BadImageFormatException class with serialized data.

BadImageFormatException(String)

Inicjuje nowe wystąpienie klasy BadImageFormatException klasy przy użyciu określonego komunikatu o błędzie.Initializes a new instance of the BadImageFormatException class with a specified error message.

BadImageFormatException(String, Exception)

Inicjuje nowe wystąpienie klasy BadImageFormatException klasy przy użyciu określonego komunikatu o błędzie i odwołania do wewnętrznego wyjątku, który jest przyczyną tego wyjątku.Initializes a new instance of the BadImageFormatException class with a specified error message and a reference to the inner exception that is the cause of this exception.

BadImageFormatException(String, String)

Inicjuje nowe wystąpienie BadImageFormatException klasy z określonym komunikatem o błędzie i nazwą pliku.Initializes a new instance of the BadImageFormatException class with a specified error message and file name.

BadImageFormatException(String, String, Exception)

Inicjuje nowe wystąpienie klasy BadImageFormatException klasy przy użyciu określonego komunikatu o błędzie i odwołania do wewnętrznego wyjątku, który jest przyczyną tego wyjątku.Initializes a new instance of the BadImageFormatException class with a specified error message and a reference to the inner exception that is the cause of this exception.

Właściwości

Data

Pobiera kolekcję par klucz/wartość, które zawierają dodatkowe informacje zdefiniowane przez użytkownika dotyczące wyjątku.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Odziedziczone po Exception)
FileName

Pobiera nazwę pliku, który powoduje ten wyjątek.Gets the name of the file that causes this exception.

FusionLog

Pobiera plik dziennika, który opisuje dlaczego ładowanie zestawu nie powiodło się.Gets the log file that describes why an assembly load failed.

HelpLink

Pobiera lub ustawia link do pliku pomocy skojarzonego z tym wyjątkiem.Gets or sets a link to the help file associated with this exception.

(Odziedziczone po Exception)
HResult

Pobiera lub ustawia wartość HRESULT, kodowane wartości liczbowe przypisane do określonego wyjątku.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Odziedziczone po Exception)
InnerException

Pobiera wystąpienie Exception, które spowodowało wyjątek bieżący.Gets the Exception instance that caused the current exception.

(Odziedziczone po Exception)
Message

Pobiera komunikat o błędzie i nazwę pliku, który spowodował wyjątek.Gets the error message and the name of the file that caused this exception.

Source

Pobiera lub ustawia nazwę aplikacji lub obiekt, który powoduje błąd.Gets or sets the name of the application or the object that causes the error.

(Odziedziczone po Exception)
StackTrace

Pobiera ciąg reprezentujący bezpośrednie ramki w stosie wywołań.Gets a string representation of the immediate frames on the call stack.

(Odziedziczone po Exception)
TargetSite

Pobiera metodę, która zgłasza bieżący wyjątek.Gets the method that throws the current exception.

(Odziedziczone po Exception)

Metody

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.Determines whether the specified object is equal to the current object.

(Odziedziczone po Object)
GetBaseException()

Gdy jest zastępowany w klasie pochodnej, zwraca Exception, który jest główną przyczyną jednego lub kilku kolejnych wyjątków.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Odziedziczone po Exception)
GetHashCode()

Służy jako domyślna funkcja skrótu.Serves as the default hash function.

(Odziedziczone po Object)
GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo Ustawia obiekt z nazwą pliku, dziennikiem pamięci podręcznej zestawów i dodatkowymi informacjami o wyjątku.Sets the SerializationInfo object with the file name, assembly cache log, and additional exception information.

GetType()

Pobiera typ środowiska uruchomieniowego bieżącego wystąpienia.Gets the runtime type of the current instance.

(Odziedziczone po Exception)
MemberwiseClone()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
ToString()

Zwraca w pełni kwalifikowaną nazwę tego wyjątku oraz ewentualny komunikat o błędzie, nazwę wyjątku wewnętrznego i ślad stosu.Returns the fully qualified name of this exception and possibly the error message, the name of the inner exception, and the stack trace.

Zdarzenia

SerializeObjectState

Występuje, gdy wyjątek jest serializowany w celu utworzenia obiektu stanu wyjątku, który zawiera serializowane dane dotyczące wyjątku.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Odziedziczone po Exception)

Dotyczy

Zobacz też