BadImageFormatException Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Die Ausnahme, die ausgelöst wird, wenn das Dateiimage einer Dynamic Link Library (DLL) oder eines ausführbaren Programms ungültig ist.
public ref class BadImageFormatException : Exception
public ref class BadImageFormatException : SystemException
public class BadImageFormatException : Exception
public class BadImageFormatException : SystemException
[System.Serializable]
public class BadImageFormatException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class BadImageFormatException : SystemException
type BadImageFormatException = class
inherit Exception
type BadImageFormatException = class
inherit SystemException
[<System.Serializable>]
type BadImageFormatException = class
inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type BadImageFormatException = class
inherit SystemException
Public Class BadImageFormatException
Inherits Exception
Public Class BadImageFormatException
Inherits SystemException
- Vererbung
- Vererbung
- Attribute
Hinweise
Diese Ausnahme wird ausgelöst, wenn das Dateiformat einer dynamischen Linkbibliothek (.dll Datei) oder einer ausführbaren Datei (.exe Datei) nicht dem Format entspricht, das die allgemeine Sprachlaufzeit erwartet. Insbesondere wird die Ausnahme unter den folgenden Bedingungen ausgelöst:
Eine frühere Version eines .NET-Dienstprogramms, z. B. ILDasm.exe oder installutil.exe, wird mit einer Assembly verwendet, die mit einer späteren Version von .NET entwickelt wurde.
Um diese Ausnahme zu beheben, verwenden Sie die Version des Tools, das der Version von .NET entspricht, die zum Entwickeln der Assembly verwendet wurde. Dies erfordert möglicherweise das Ändern der
Path
Umgebungsvariable oder das Bereitstellen eines vollqualifizierten Pfads zur richtigen ausführbaren Datei.Sie versuchen, eine nicht verwaltete Dynamic Link Library oder ausführbare Datei (z. B. eine Windows System-DLL) zu laden, als ob es sich um eine .NET-Assembly handelt. Im folgenden Beispiel wird dies mithilfe der Assembly.LoadFile Methode veranschaulicht, um Kernel32.dll zu laden.
// 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.
Um diese Ausnahme zu beheben, greifen Sie auf die methoden zu, die in der DLL definiert sind, indem Sie die Von Ihrer Entwicklungssprache bereitgestellten Features verwenden, z. B. die
Declare
Anweisung in Visual Basic oder das DllImportAttribute Attribut mit demextern
Schlüsselwort in C# und F#.Sie versuchen, eine Referenzassembly in einem anderen Kontext als dem Nur-Spiegelungskontext zu laden. Sie können dieses Problem auf zwei Arten beheben:
- Sie können die Implementierungsassembly anstelle der Referenzassembly laden.
- Sie können die Referenzassembly im Nur-Spiegelungskontext laden, indem Sie die Assembly.ReflectionOnlyLoad Methode aufrufen.
Eine DLL oder ausführbare Datei wird als 64-Bit-Assembly geladen, enthält jedoch 32-Bit-Features oder Ressourcen. Sie basiert beispielsweise auf COM-Interop- oder Aufrufmethoden in einer 32-Bit-Bibliothek für dynamische Verknüpfungen.
Um diese Ausnahme zu beheben, legen Sie die Plattformzieleigenschaft des Projekts auf x86 (anstelle von x64 oder AnyCPU) fest, und kompilieren Sie es erneut.
Die Komponenten Ihrer Anwendung wurden mithilfe verschiedener Versionen von .NET erstellt. In der Regel tritt diese Ausnahme auf, wenn eine Anwendung oder Komponente, die mithilfe der .NET Framework 1.0 oder der .NET Framework 1.1 entwickelt wurde, versucht, eine Assembly zu laden, die mithilfe der .NET Framework 2.0 SP1 oder höher entwickelt wurde, oder wenn eine Anwendung, die mit dem .NET Framework 2.0 SP1 entwickelt wurde, oder wenn eine Anwendung, die mit dem .NET Framework 2.0 SP1 entwickelt wurde, oder .NET Framework 3.5 versucht, eine Assembly zu laden, die mithilfe der .NET Framework 4 oder höher entwickelt wurde. Der BadImageFormatException Fehler kann als Kompilierungszeitfehler gemeldet werden, oder die Ausnahme kann zur Laufzeit ausgelöst werden. Im folgenden Beispiel wird eine
StringLib
Klasse definiert,ToProperCase
die über ein einzelnes Element verfügt und sich in einer Assembly mit dem Namen StringLib.dll befindet.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 Module
Im folgenden Beispiel wird die Spiegelung verwendet, um eine Assembly mit dem Namen StringLib.dll zu laden. Wenn der Quellcode mit einem .NET Framework 1.1-Compiler kompiliert wird, wird eine BadImageFormatException durch die Assembly.LoadFrom Methode ausgelöst.
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.
Um diese Ausnahme zu beheben, stellen Sie sicher, dass die Assembly, deren Code ausgeführt wird und die Ausnahme auslöst, und dass die Assembly geladen werden soll, beide zielkompatible Versionen von .NET.
Die Komponenten Ihrer Anwendung zielen auf verschiedene Plattformen ab. Sie versuchen beispielsweise, ARM-Assemblys in einer x86-Anwendung zu laden. Sie können das folgende Befehlszeilenprogramm verwenden, um die Zielplattformen einzelner .NET-Assemblys zu ermitteln. Die Liste der Dateien sollte als durch Leerzeichen getrennte Liste in der Befehlszeile bereitgestellt werden.
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 Module
Diese Ausnahme kann durch Reflektion auf ausführbare Dateien in C++ ausgelöst werden. Meistens hat dabei der C++-Compiler die Umsetzungsadressen oder den .Reloc-Abschnitt der ausführbaren Datei entfernt. Damit die Umsetzungsadresse in einer ausführbaren Datei in C++ erhalten bleibt, geben Sie beim Verknüpfen /fixed:no an.
BadImageFormatException verwendet das HRESULT COR_E_BADIMAGEFORMAT
, das den Wert 0x8007000B hat.
Eine Liste der anfänglichen Eigenschaftswerte für eine Instanz von BadImageFormatException, finden Sie unter den BadImageFormatException Konstruktoren.
Konstruktoren
BadImageFormatException() |
Initialisiert eine neue Instanz der BadImageFormatException-Klasse. |
BadImageFormatException(SerializationInfo, StreamingContext) |
Initialisiert eine neue Instanz der BadImageFormatException-Klasse mit serialisierten Daten. |
BadImageFormatException(String) |
Initialisiert eine neue Instanz der BadImageFormatException-Klasse mit einer angegebenen Fehlermeldung. |
BadImageFormatException(String, Exception) |
Initialisiert eine neue Instanz der BadImageFormatException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme ausgelöst hat. |
BadImageFormatException(String, String) |
Initialisiert eine neue Instanz der BadImageFormatException-Klasse mit einer angegebenen Fehlermeldung und einem angegebenen Dateinamen. |
BadImageFormatException(String, String, Exception) |
Initialisiert eine neue Instanz der BadImageFormatException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme ausgelöst hat. |
Eigenschaften
Data |
Ruft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen zur Ausnahme bereitstellen. (Geerbt von Exception) |
FileName |
Ruft den Namen der Datei ab, die diese Ausnahme verursacht hat. |
FusionLog |
Ruft die Protokolldatei ab, in der beschrieben wird, warum das Laden einer Assembly fehlschlug. |
HelpLink |
Ruft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest. (Geerbt von Exception) |
HResult |
Ruft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist. (Geerbt von Exception) |
InnerException |
Ruft die Exception-Instanz ab, die die aktuelle Ausnahme verursacht hat. (Geerbt von Exception) |
Message |
Ruft die Fehlermeldung und den Namen der Datei ab, die diese Ausnahme verursacht hat. |
Source |
Gibt den Namen der Anwendung oder des Objekts zurück, die bzw. das den Fehler verursacht hat, oder legt diesen fest. (Geerbt von Exception) |
StackTrace |
Ruft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab. (Geerbt von Exception) |
TargetSite |
Ruft die Methode ab, die die aktuelle Ausnahme auslöst. (Geerbt von Exception) |
Methoden
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetBaseException() |
Gibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die Grundursache für eine oder mehrere nachfolgende Ausnahmen ist. (Geerbt von Exception) |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Legt das SerializationInfo-Objekt mit dem Dateinamen, dem Assemblycache-Protokoll und zusätzlichen Informationen zur Ausnahme fest. |
GetObjectData(SerializationInfo, StreamingContext) |
Legt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest. (Geerbt von Exception) |
GetType() |
Ruft den Laufzeittyp der aktuellen Instanz ab. (Geerbt von Exception) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt den vollqualifizierten Namen dieser Ausnahme und ggf. die Fehlermeldung sowie den Namen der inneren Ausnahme und die Stapelüberwachung zurück. |
Ereignisse
SerializeObjectState |
Veraltet.
Tritt auf, wenn eine Ausnahme serialisiert wird, um ein Ausnahmezustandsobjekt mit serialisierten Daten über die Ausnahme zu erstellen. (Geerbt von Exception) |