2016-10-28 13 views
1

私はそうのようなCSharpCodeProviderを作成:CSharpCodeProviderを.NET 4.6.2の代わりに.NET 4.5.0にする方法は?

CSharpCodeProvider codeProvider  = new CSharpCodeProvider(new Dictionary<string, string>{{ "CompilerVersion", "v4.0" }}); 
CompilerParameters compileParameters = new CompilerParameters(refs.ToArray(), newFile, debugBuild) { WarningLevel = 4 }; 

私はWPF FormattedTextオブジェクトがとても好きで作成するスクリプトを持っている:

FormattedText volumeText = new FormattedText(volumeString, Core.Globals.GeneralOptions.CurrentCulture, FlowDirection.LeftToRight, typeFace, SuperDom.Font.Size, ForeColor) { MaxLineCount = 1, MaxTextWidth = renderWidth - 6, Trimming = TextTrimming.CharacterEllipsis }; 

.NET 4.6.2は、DPIスケーリングを指定するための新しいコンストラクタを追加し、現在使用しているメソッドは廃止予定です。しかし、私たちのアプリケーションは.NET 4.5.0をターゲットとしており、これが私たちがサポートしているものです。誰かが使用しようとした場合

Warning: 'System.Windows.Media.FormattedText.FormattedText(string, System.Globalization.CultureInfo, System.Windows.FlowDirection, System.Windows.Media.Typeface, double, System.Windows.Media.Brush)' is obsolete: 'Use the PixelsPerDip override' 

有効なユースケースは、(私たちのために)がありません新しいコンストラクタが有効であり、実際に私が期待する何を:私のコードをコンパイルするときしかし、私はまだ、次の警告を受けますそのメソッドのシグネチャが4.5で間違っているため、コンパイルエラーが発生します。

これらの警告を回避する方法はありますか?以前はコードプロバイダにCompilerVersionを指定していませんでしたが、それを追加しても役に立たなかったので、ここで他の質問で見たことに基づいて、v4.0が私の場合に使用する唯一の有効なバージョンです。別の警告レベルでこれを回避できますか?

+1

[この質問](http://stackoverflow.com/questions/20018979/how-can-i-target-a-specific-language-version-using-codedom)では、CodeDomで異なるフレームワークをどのようにターゲット設定するかについて詳しく説明しています。今日、そして4.5フレームワークで同じアプローチが当てはまるのかどうかは考えていませんが、それはあなたの問題です。コンパイラのバージョンではありません。 –

+0

Hmya、あなたは実際に4.5をターゲットにしていません。 VSがインストールする「デベロッパーパック」のおかげで、あなたの開発マシン上の古い.NETバージョンを意図的にターゲットにすることができます。 System.CodeDomでは機能しません。クライアントは利用できません。クライアントのマシンにインストールされているバージョンがあれば、それは予測できません。実際にはFormattedTextを混乱させるので、* pixelsPerDip *引数をとるオーバーロードには依存できません。クリーンな修正がない場合は、その警告を食べる必要があります。 –

+0

@HansPassant私のプロジェクトは.NET 4.5をターゲットにしています。私のコードで.NET 4.6.2で導入されたオーバーロードを使用しようとすると、コンパイルエラーが発生します。これは、上記の廃止された警告を得るのではなく、スクリプトをコンパイルするときに起こりたいことです。 – WasGoodDone

答えて

1

Visual Studioがこれを処理する方法は、コンパイル時にシステムアセンブリを使用しないことです。代わりに、参照アセンブリのセットが使用されます。これには、正しいクラスとメソッドが含まれていますが、実装はありません。 4.5と4.6の参照アセンブリは異なる可能性があるため、4.6で追加された特定の属性は、4.5参照アセンブリを対象とするときには表示されません。これらの参照アセンブリがランタイムシステム上で利用可能でない限り、それらを抑制する以外に、警告を回避する方法はありません。 #pragmaを使用してください。

しかし、コンパイルが実行時システム上で発生した場合、私はあなたの主張に反対する必要があります。

を物事の新しい方法は無関係ですので、しかし、我々のアプリケーションは、.NET 4.5.0を対象としています。

あなたは、.NET 4.6アセンブリに対してスクリプトをコンパイルしているので、新しいやり方は非常に重要です。ランタイムシステムでコンパイルしている場合は、新しいコンストラクタが使用可能かどうかを動的に検出し、使用可能な場合はそれを使用できます。あなたのアプリケーションは、.NET 4.5をターゲットに構築されているかもしれませんが、あなたのスクリプトはそうではありません、あるいは少なくとも常にそうとは限りません。

+0

私は私の質問に、より明確に言い直しました。スクリプトで4.6.2のコードをサポートしたくないので、私が望むのは、4.5に対してコンパイルされたスクリプトです。誰かが新しいメソッドを使用しようとすると、代わりにコンパイルエラーが予想されます。私はそれが提案された解決策であるかどうか、あるいは問題を回避する手段がないと言っている場合には、あなたの回答に従っていません。 – WasGoodDone

+0

あなたのスクリプトはどこでコンパイルされていますか?あなたのシステムやエンドユーザの? 「スクリプト」という名前は後者を意味します。参照アセンブリを持つ独自のシステムでコンパイルする方法、または参照アセンブリがあることを確認する方法を見つけることができます。いずれにせよ、不可能なことはありません。それらを使用することを確実にしてください。 – hvd

関連する問題