前置き
現在参画している現場で保守している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/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>