System.BadImageFormatException (その2 x64 と x86)
ダイナミック リンク ライブラリ (DLL) または実行可能プログラムのファイル イメージが無効である場合にスローされる例外。
今回は、x64 用に作成したDLLを x86 プログラムで呼び出した場合の例外を実験。
[実験ソース(C#) DLL側]
using System;
namespace ClassLibrary1
{
public class Class1
{
public static void PrintHello()
{
Console.WriteLine("Hello");
}
}
}
このプログラムを x64 でコンパイル。
自分のPCには、VS C# 2010 Express しかインストールしていないため、直接プロジェクトファイルを編集。
(以下の PlatformTarget の部分)
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
つづけて、このDLLを呼び出すプログラムを作成。
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ClassLibrary1.Class1.PrintHello();
}
}
}
[結果]
ハンドルされていない例外: System.BadImageFormatException: ファイルまたはアセンブリ 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
場所 ConsoleApplication1.Program.Main(String[] args)
[対処など]
同じプラットフォームにすることで正常に動作する。
他にも、逆パターンで、x86 用に作成した DLL を x64 プログラムで使用する場合もおきる。(らしい)
この場合は、プラットフォームターゲット プロパティを x86 (x64 でも AnyCPU でもなく) に設定して再コンパイルすると良い。