none
Add-Typeで読み込めるC#のコードの言語バージョンが古いです。 RRS feed

  • 質問

  • お世話になっております。

    さて、Add-TypeでC# 7.3相当のコードを読み込もうとして、

    $cs='public class A<E> where E : Enum {}'
    Add-Type -TypeDefinition $cs
    

    とすると、

    型または名前空間名 'Enum' が見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足しています。
    

    というエラーになってしまいました。ジェネリックの型引数の制約でEnumというのは列挙型を意味していて、C# 7.3で採用された新機能です。

    そこで、明示的に言語バージョンを指定して、

    $o=[System.CodeDom.Compiler.CompilerParameters]::new()
    $o.CompilerOptions='/langversion:7.3'
    Add-Type -TypeDefinition $cs -CompilerParameters $o
    

    としたところ、

    /langversion に対する無効なオプション '7.3' です。ISO-1、ISO-2、3、4、5、または Default でなければなりません。
    

    というエラーが出て、Add-Typeが認識可能なC#の言語バージョンが5までとなっていることが判明しました。使用しているPowerShellは、Windows PowerShell 5.1、.Net Frameworkは4.8となっています。

    最新のC#の言語バージョンを手っ取り早く使う方法は、クロスプラットフォームの.Net Core 3.1とPowerShell Core 6.2に乗り換えることですが、互換性の面で不安があるため踏み切れていません。

    そこで、今使っているWindows PowerShellおよび.Net Frameworkに搭載されているC#コンパイラーを7.3相当のものに入れ替えたいのですが、果たしてそのようなことは可能なのでしょうか。

    2020年2月4日 11:24

回答

  • 無理です。

    開発環境と実行環境の違いによるものです。開発環境としてVisual Studioに付属しているC#コンパイラーは順次更新されていますが、実行環境として.NET Frameworkに付属しているC#コンパイラー(C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe)は5.0から更新されていません。
    その上で、PowerShellはスクリプト言語ですから実行環境としての.NET Framework付属コンパイラーを使用します。

    • 回答としてマーク fzok4234 2020年2月5日 7:34
    2020年2月4日 11:49

すべての返信

  • 無理です。

    開発環境と実行環境の違いによるものです。開発環境としてVisual Studioに付属しているC#コンパイラーは順次更新されていますが、実行環境として.NET Frameworkに付属しているC#コンパイラー(C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe)は5.0から更新されていません。
    その上で、PowerShellはスクリプト言語ですから実行環境としての.NET Framework付属コンパイラーを使用します。

    • 回答としてマーク fzok4234 2020年2月5日 7:34
    2020年2月4日 11:49
  • 現時点で無理となれば、やはり2020年11月にリリース予定の.Net 5を待たなければならないのでしょうね。

    そのころにはPowerShell 7も正式版として使用可能になっていると思います。

    2020年2月4日 12:12