LoginSignup
5
6

More than 3 years have passed since last update.

[ASP.NET Webサイト] Roslynのインストールとweb.configの設定が継承される問題について

Last updated at Posted at 2019-07-24

前置き

現在参画している現場で保守しているASP.NETのサイト(VB.NET)は、Roslynがインストールされていなかたっため、
Visual Basic 14の新機能すら使用することが出来ませんでした。
例えば複数行の文字列リテラルを含んだコードは、コンパイルエラーになってしまいます。

ローカル開発環境ではRoslynを適用してしまっていたので、
ローカルデバッグではコンパイルエラーにならないのにステージング環境に配置するとエラーになってしまうという状況でした。

マイグレーションが現在予定されていないシステムなので、
今後も継続して保守していく必要があります。
せめてVB14の機能は使えるようにしたく、ステージング環境でRoslynのインストールを試してみることにしました。

準備

Roslynのインストールはこちらの記事がわかりやすいので参考に。

上記の記事ですとMicrosoft.CodeDom.Providers.DotNetCompilerPlatformのバージョンは1.0.1ですが、
現在NuGetで取得できる最新版は2.0.1になります。

※ちなみにMicrosoft.CodeDom.Providers.DotNetCompilerPlatformのバージョン1.0.*台はMicrosoft.Net.Compilersと依存関係にあり、
そちらも一緒にインストールしておく必要がありましたが、
2.0.0で依存関係は廃止されたので、2.0.1ではMicrosoft.Net.Compilersは不要です。

サイトのbinディレクトリに
上記の加えてweb.configにコンパイラの参照を追記する必要があります。

<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
    </compilers>
  </system.codedom>

問題

テスト環境にbin/roslynMicrosoft.CodeDom.Providers.DotNetCompilerPlatformの配置、
web.configへのコンパイラ参照の追記を行ったところ、
サイト内で入れ子になっているASP.NET Webアプリケーションで

Microsoft.CodeDom.Providers.DotNetCompilerPlatformが見つかりません。

といったエラーが発生するようになってしまいました。

原因

原因はweb.configの設定が、サイト内のweb.configに継承されてしまうためでした。
現在担当しているサイトは、以下のように親サイトに下にASP.NET Webサイト、Webアプリケーションの子サイトが入れ子になっています。

親サイト[ASP.NET Webサイト]
|-App_Code
|-bin
    |- roslyn
    |- Microsoft.CodeDom.Providers.DotNetCompilerPlatform(2.0.1)
|-自分が担当しているサイト[ASP.NET Webサイト]
|-エラーが発生したサイト[ASP.NET Webアプリケーション]
    |-bin
      |- roslyn
      |- Microsoft.CodeDom.Providers.DotNetCompilerPlatform(1.0.3)
    |- ② web.cofing(エラーが発生したサイトの)
|- ① web.cofing(親サイトの)

今回は①にコンパイラ参照を追記したところ、②のweb.configに継承されてしまい、
さらに運悪く、エラーが発生したサイトのbinディレクトリに古いバージョンのMicrosoft.CodeDom.Providers.DotNetCompilerPlatformが存在したため、
参照DLLのバージョン不一致によりコンパイルエラーが発生してしまいました。

対策

web.configの設定を子サイトのweb.configに継承させないようにするには、以下のタグを使います。

<location path="." inheritInChildApplications="false">

なので、以下のようにコンパイラ参照を指定する<system.codedom><location>タグを囲えば、
コンパイラ参照の設定は子サイトに継承されず、
エラーも発生しなくなりました。

<location path="." inheritInChildApplications="false">
<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
    </compilers>
  </system.codedom>
<location>
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6