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

# 前置き

現在参画している現場で保守しているASP.NETのサイト（VB.NET）は、[Roslyn](https://www.buildinsider.net/enterprise/roslyn/01)がインストールされていなかたっため、
[Visual Basic 14の新機能](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/getting-started/whats-new#visual-basic-14)すら使用することが出来ませんでした。
例えば複数行の文字列リテラルを含んだコードは、コンパイルエラーになってしまいます。

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

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

# 準備
Roslynのインストールは[こちらの記事](https://www.ipentec.com/document/visual-studio-install-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/roslyn`、`Microsoft.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>
```