redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

(小ネタ).NET Frameworkの本体と、targeting packは別物

タイトルからして、何当たり前のことを言っているんだ感が全開ですが、今後同じ間違いをしないように書いておきます。

開発環境とネットワークでつながっていない環境に、ASP.NET MVC 5 アプリケーションをデプロイする必要がありました。

デプロイの「発行先を選択」でフォルダを選択して、ローカルPCのパスを指定します。

指定したパスにアプリケーション一式が格納されたフォルダが作成されるので、それを何らかの手段で対象の環境に持っていき、IISのサイトの下にフォルダごと配置します。以下のサイトの内容と大体同じ手順です。

[VisualStudio] 作成したWebプロジェクトをIISに乗せる – .NETちょこっとリファレンス

その後、ページを表示したら、Web.config の以下の部分でエラーが発生。

    <compilation debug="true" targetFramework="4.6" />

これは、.NET 4.6が入っていなさそうだなと思い、確認するとやはり .NET 4.5.2 しか入っていませんでした。

そこで .NET Framework 4.6 Targeting Pack をインストールして確認すると、エラーの内容が以下のように変化しました。

メソッドが見つかりません:'!!0[] System.Array.Empty()'
例外の詳細:System.MissingMethodException:メソッドが見つかりません:'!!0[] System.Array.Empty()'

上記メッセージの後にスタックトレースが続くのですが、それによると発生個所はUnityConfig.cs でした。

さて、勘のいい方ならば、すでにわかったと思いますが、上記のエラーメッセージを元に調べると、.NET 4.6 でビルドしたプログラムを .NET 4.5.2 上で実行しようとした時に発生するエラーでした。

つまり、.NET Framework 4.6 Targeting Pack を入れたのに、.NET Framework 4.6本体を入れていなかったのです。

過去の自分の記事を参考にしたのですが、そちらはそもそもビルドサーバーの話でした。

教訓:公式ドキュメントをちゃんと確認する。

.NET Framework Developer Pack または再頒布可能パッケージをインストールするには | Microsoft Docs

.NET Framework のシステム要件 | Microsoft Docs

ちなみに(1):実行環境には、.NET Framework 4.6 Targeting Pack は不要みたいです。

ちなみに(2):.NET 4.6.1以降の Developer Pack には、.NET Framework本体も同梱されています。