英語で読む

次の方法で共有


BadImageFormatException クラス

定義

ダイナミック リンク ライブラリ (DLL) または実行可能プログラムのファイル イメージが無効である場合にスローされる例外。

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
継承
BadImageFormatException
継承
BadImageFormatException
属性

注釈

この例外は、ダイナミック リンク ライブラリ (.dll ファイル) または実行可能ファイル (.exe ファイル) のファイル形式が、共通言語ランタイムが想定する形式に準拠していない場合にスローされます。 特に、例外は次の条件でスローされます。

  • ILDasm.exeやinstallutil.exeなど、以前のバージョンの .NET ユーティリティは、新しいバージョンの .NET で開発されたアセンブリで使用されます。

    この例外に対処するには、アセンブリの開発に使用された .NET のバージョンに対応するツールのバージョンを使用します。 これには、環境変数を Path 変更するか、正しい実行可能ファイルへの完全修飾パスを指定する必要があります。

  • .NET アセンブリであるかのように、アンマネージド ダイナミック リンク ライブラリまたは実行可能ファイル (Windows システム DLL など) を読み込もうとしています。 次の例は、このメソッドを使用して Assembly.LoadFile 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.
    

    この例外に対処するには、開発言語によって提供される機能 (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 つのメンバーを持ち、 ToProperCaseStringLib.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.
    

    次の例では、リフレクションを使用して、StringLib.dllという名前のアセンブリを読み込みます。 ソース コードが .NET Framework 1.1 コンパイラでコンパイルされている場合は、メソッドによって Assembly.LoadFrom a BadImageFormatException がスローされます。

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

    この例外に対処するには、コードが実行され、例外をスローするアセンブリと、読み込まれるアセンブリ (両方ともターゲット互換性のあるバージョンの .NET) を確認します。

  • アプリケーションのコンポーネントは、さまざまなプラットフォームを対象としています。 たとえば、x86 アプリケーションで ARM アセンブリを読み込もうとしています。 次のコマンド ライン ユーティリティを使用して、個々の .NET アセンブリのターゲット プラットフォームを決定できます。 ファイルの一覧は、コマンド ラインでスペース区切りのリストとして指定する必要があります。

    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");
                }
             }
          }
       }
    }
    
  • 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)

適用対象

製品 バージョン
.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

こちらもご覧ください