.NetFramework 4 のみで 2.0 向けアプリケーションを動作させる

今年の 4月に Microsoft から .NetFramework 4 がリリースされましたが,.NetFramework 4 はこれまでの 2.0 〜 3.5 とは「別物」と認識されるようです.そのため,.NetFramework 4 しかインストールされていない環境で,.NetFramework 2.0 向けにビルドされたアプリケーションを実行しようとすると,以下のようなエラーが発生します*1

これを回避するためには,<supportedRuntime> 要素 - MSDN にしたがってアプリケーション構成ファイル(Visual Studio 上では「app.config」,ビルド後は「実行ファイル名.exe.config」)を修正します.

.NET Framework Version 1.1 または .NET Framework Version 2.0 で作成されたアプリケーションまたはコンポーネント .NET Framework Version 4 で実行するには、サポートされるランタイムのリストで .NET Framework 4 を指定するだけでは不十分です。さらに、構成ファイル内の 要素で、useLegacyV2RuntimeActivationPolicy 属性を true に設定する必要があります。設定しない場合、サポートされるランタイムのリストで、.NET Framework 4 よりも低いバージョンの .NET Framework のうち最上位バージョンが検索されます。.NET Framework 4 がリストにある唯一のランタイムである場合、読み込みは失敗します。

<supportedRuntime> 要素

具体的には,以下のような設定をアプリケーション構成ファイルに追加,または修正します.

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727" sku="Client"/>
  </startup>
</configuration>

8.3形式(MS-DOSファイル名)の短いファイル名を使用してはならない

私が嵌った現象..NetFramework 上で動作する実行ファイルは,起動時に *.exe.config ファイルが存在するかどうかを確認します.このとき,シェルなどで 8.3形式のファイル名を指定して実行した場合には,そのままのファイル名を用いてアプリケーション構成ファイルを探してしまうようです.

例えば,foo-bar-bas.exe の 8.3形式のファイル名は foo-ba~1.exe となりますが,foo-ba~1.exe を指定して実行するとアプリケーションは foo-bar-bas.exe.config ではなく foo-ba~1.exe.config を探すようになっているようです.このせいで,実行ファイルがアプリケーション構成ファイルを見つけられず,最初の画像のエラーダイアログが表示されてしまうと言う現象に嵌りました.

*1:Windows Vista 以降は .NetFramework 2.0 はデフォルトでインストールされているので,この状況になるのは Windows XP のみですが.