BadImageFormatException クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ダイナミック リンク ライブラリ (DLL) または実行可能プログラムのファイル イメージが無効である場合にスローされる例外。
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
- 継承
- 継承
- 属性
注釈
この例外は、ダイナミック リンク ライブラリ (.dll ファイル) または実行可能ファイル (.exe ファイル) のファイル形式が、共通言語ランタイムが想定する形式に準拠していない場合にスローされます。 特に、例外は次の条件でスローされます。
ILDasm.exeやinstallutil.exeなど、以前のバージョンの .NET ユーティリティは、新しいバージョンの .NET で開発されたアセンブリで使用されます。
この例外に対処するには、アセンブリの開発に使用された .NET のバージョンに対応するツールのバージョンを使用します。 これには、環境変数を
Path
変更するか、正しい実行可能ファイルへの完全修飾パスを指定する必要があります。.NET アセンブリであるかのように、アンマネージド ダイナミック リンク ライブラリまたは実行可能ファイル (Windows システム DLL など) を読み込もうとしています。 次の例は、このメソッドを使用して Assembly.LoadFile 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.
この例外に対処するには、開発言語によって提供される機能 (Visual Basicのステートメント、C# と DllImportAttribute F# のキーワードを含む
extern
属性などDeclare
) を使用して DLL で定義されたメソッドにアクセスします。リフレクションのみのコンテキスト以外のコンテキストで参照アセンブリを読み込もうとしています。 この問題に対処するには、次の 2 つの方法があります。
- 参照アセンブリではなく、実装アセンブリを読み込むことができます。
- リフレクションのみのコンテキストで参照アセンブリを読み込むには、メソッドを Assembly.ReflectionOnlyLoad 呼び出します。
DLL または実行可能ファイルは 64 ビット アセンブリとして読み込まれますが、32 ビットの機能またはリソースが含まれています。 たとえば、COM 相互運用機能に依存したり、32 ビットダイナミック リンク ライブラリ内のメソッドを呼び出したりします。
この例外に対処するには、プロジェクトの Platform ターゲット プロパティを x86 (x64 または AnyCPU ではなく) に設定し、再コンパイルします。
アプリケーションのコンポーネントは、異なるバージョンの .NET を使用して作成されました。 通常、この例外は、.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 時エラーとして報告されるか、実行時に例外がスローされる可能性があります。 次の例では、
StringLib
1 つのメンバーを持ち、ToProperCase
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 Module
次の例では、リフレクションを使用して、StringLib.dllという名前のアセンブリを読み込みます。 ソース コードが .NET Framework 1.1 コンパイラでコンパイルされている場合は、メソッドによって Assembly.LoadFrom a 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.
この例外に対処するには、コードが実行され、例外をスローするアセンブリと、読み込まれるアセンブリ (両方ともターゲット互換性のあるバージョンの .NET) を確認します。
アプリケーションのコンポーネントは、さまざまなプラットフォームを対象としています。 たとえば、x86 アプリケーションで ARM アセンブリを読み込もうとしています。 次のコマンド ライン ユーティリティを使用して、個々の .NET アセンブリのターゲット プラットフォームを決定できます。 ファイルの一覧は、コマンド ラインでスペース区切りのリストとして指定する必要があります。
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
C++ 実行可能ファイルにリフレクションを実行すると、この例外がスローされる場合があります。 最大の原因は、C++ コンパイラが再配置アドレスまたは .Reloc セクションを実行可能ファイルから除去することです。 C++ 実行ファイルの再配置アドレスを保持するには、リンク時に /fixed:no を指定します。
BadImageFormatException は、0x8007000B値を持つ HRESULT COR_E_BADIMAGEFORMAT
を使用します。
インスタンスの初期プロパティ値の一覧についてはBadImageFormatExceptionを参照してください、BadImageFormatExceptionコンス トラクター。
コンストラクター
BadImageFormatException() |
BadImageFormatException クラスの新しいインスタンスを初期化します。 |
BadImageFormatException(SerializationInfo, StreamingContext) |
シリアル化したデータを使用して、BadImageFormatException クラスの新しいインスタンスを初期化します。 |
BadImageFormatException(String) |
指定したエラー メッセージを使用して、BadImageFormatException クラスの新しいインスタンスを初期化します。 |
BadImageFormatException(String, Exception) |
指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、BadImageFormatException クラスの新しいインスタンスを初期化します。 |
BadImageFormatException(String, String) |
指定したエラー メッセージとファイル名を使用して、BadImageFormatException クラスの新しいインスタンスを初期化します。 |
BadImageFormatException(String, String, Exception) |
指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、BadImageFormatException クラスの新しいインスタンスを初期化します。 |
プロパティ
Data |
例外に関する追加のユーザー定義情報を提供する、キーと値のペアのコレクションを取得します。 (継承元 Exception) |
FileName |
現在の例外の原因であるファイルの名前を取得します。 |
FusionLog |
アセンブリの読み込みに失敗した原因を説明するログ ファイルを取得します。 |
HelpLink |
この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。 (継承元 Exception) |
HResult |
特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。 (継承元 Exception) |
InnerException |
現在の例外の原因となる Exception インスタンスを取得します。 (継承元 Exception) |
Message |
エラー メッセージ、および例外の原因であるファイルの名前を取得します。 |
Source |
エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。 (継承元 Exception) |
StackTrace |
呼び出し履歴で直前のフレームの文字列形式を取得します。 (継承元 Exception) |
TargetSite |
現在の例外がスローされたメソッドを取得します。 (継承元 Exception) |
メソッド
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
GetBaseException() |
派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の根本原因である Exception を返します。 (継承元 Exception) |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetObjectData(SerializationInfo, StreamingContext) |
ファイル名、アセンブリ キャッシュ ログ、および追加の例外情報を使用して SerializationInfo オブジェクトを設定します。 |
GetObjectData(SerializationInfo, StreamingContext) |
派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。 (継承元 Exception) |
GetType() |
現在のインスタンスのランタイム型を取得します。 (継承元 Exception) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
ToString() |
この例外の絶対限定名と、場合によってはエラー メッセージ、内部例外の名前、スタック トレースなどを返します。 |
events
SerializeObjectState |
互換性のために残されています。
例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。 (継承元 Exception) |