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 でもなく) に設定して再コンパイルすると良い。