by WebSurfer
2016年5月10日 17:03
Roslyn というのは Visual Studio 2015 に採用された次世代コンパイラだそうです。
ASP.NET Web アプリの場合 Web サーバーで動的にコンパイルが行われるので Roslyn の採用によってそれがうまく行かないケース(例: Trust Level が Medium のホスティングサービスを利用している)があるということを書きます。
元は MSDN Forum の「ASP.NET MVCのサイトがサーバーで実行できない問題」という表題のスレッドでの話です。
Visual Studio のデフォルト設定では、先の記事「コンパイル済みアセンブリの保存場所」で書きましたように、Web サイトプロジェクトでは全てのファイルを、Web アプリケーションプロジェクトでも一部のファイルをサーバーで動的にアセンブリにコンパイルします。
上に紹介した MSDN Forum の記事は Roslyn を使って Web サーバーで動的にコンパイルするところで問題が出たという話です。要約すると以下の通りです。
-
VS2015 で ASP.NET MVC 5 の Web アプリケーションプロジェクトを新規作成。
-
Roslyn コンパイラ関係の NuGet が 2 つ自動的にインストールされる。
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers
-
その際、Web アプリの bin フォルダに roslyn というサブフォルダが生成され、その中に csc.exe という Roslyn コンパイラが配置される。
-
さらに Web アプリの web.config に <system.codedom> 要素が生成され、サーバー側での動的コンパイルに上記 3 の Roslyn コンパイラを使うよう設定される。(注:ASP.NET MVC の場合は View を動的にコンパイルします)
-
記事を書いた人の運用サーバーでは上記 3 のコンパイラの実行権限がなく View のコンパイルに失敗する。
-
NuGet をアンインストールすれば上記 4 の設定がなくなって上記 3 のコンパイラを使わないので問題が起きない。(C:\Windows\Microsoft.NET\Framework\v4.0.30319 フォルダの csc.exe を使うと思われます・・・が未確認です)
対症療法的な解決策は上に書いた NuGet 2 つをアンインストールして Roslyn コンパイラを使わないということですが、Roslyn を使う場合は以下のいずれかの対応を取ることになります。
-
Visual Studio 側で View を含めて全てのファイルをコンパイルしてアセンブリを作成しそれをデプロイする。サーバー側での動的コンパイルは不要にする。または、
-
IIS で当該アプリをホストとしているワーカープロセスに bin/roslyn フォルダの csc.exe の実行権限を与える。
上記 1 ですが、Visual Studio のデフォルトではサーバー側でコンパイルする設定になっていますのでその変更が必要です。具体的には、MSDN ライブラリの記事 Advanced Precompile Settings Dialog Box の画像にあるように [Allow precompiled site to be updatable] にデフォルトでチェックが入っていますので、そのチェックを外します。
ただし、そうするとサーバーにデプロイした後で、View のみ(ASP.NET Web Forms アプリの場合は.aspx, .ascx のみ)差し替えるということができなくなってしまいます。(View をちょっとだけ変更しても、開発環境で全ファイルを再コンパイルして再発行することになります)
それが気に入らない場合は上記 2 の方法を取るということになりますが、そもそもが Web サーバーで .exe ファイルの実行が制限されていることからこの問題にぶつかることが多いようですので、難しいかもしれません。