System.BadImageFormatException (その3 異なる .NET Frameworkのバージョン)
ダイナミック リンク ライブラリ (DLL) または実行可能プログラムのファイル イメージが無効である場合にスローされる例外。
今回は、.NET Framework 4.0 で作成したDLLを、.NET Framework 2.0 のプログラムでLoadしようとした時に発生する例外を検証。
[実験ソース(C#) DLL側]
using System;
namespace ClassLibrary1
{
public class Class1
{
public static void PrintHello()
{
Console.WriteLine("Hello");
}
}
}
プロジェクトを右クリックし、対象のフレームワークが .NET Framework 4.0 であることを確認。
次に、このDLLを呼び出し実行するプログラム。
using System;
using System.Reflection;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string path = Path.GetFullPath(@"..\..\..\ClassLibrary1\bin\Release\ClassLibrary1.dll");
Assembly asm = Assembly.LoadFile(path);
MethodInfo PrintHello = asm.GetType("ClassLibrary1.Class1").GetMethod("PrintHello");
PrintHello.Invoke(null, null);
}
}
}
こちらは、ターゲットのフレームワークを .NET Framework 2.0 にする。
[結果]
ハンドルされていない例外: System.BadImageFormatException: このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。 (HRESULT からの例外: 0x8013101B)
場所 System.Reflection.Assembly.nLoadFile(String path, Evidence evidence)
場所 System.Reflection.Assembly.LoadFile(String path)
場所 ConsoleApplication1.Program.Main(String[] args) 場所 Program.cs:行 12
[対処など]
フレームワークのバージョンをあわせる。
ただし、今回の実験とは逆に、DLLのバージョンを 2.0 とし、コンソールアプリの方を 4.0 とした場合は、例外は発生しない。