如何使CSharpCodeProvider的目标.net 4.5.0而不是.net 4.6.2

本文关键字:net 目标 何使 CSharpCodeProvider | 更新日期: 2023-09-27 18:15:28

我创建了一个CSharpCodeProvider:

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是我的案例中唯一有效的版本。不同的警告级别能避免这种情况吗?

如何使CSharpCodeProvider的目标.net 4.5.0而不是.net 4.6.2

Visual Studio处理这个问题的方式是在编译过程中不使用系统程序集。相反,使用一组引用程序集,其中包含正确的类和方法,但没有实现。4.5和4.6的引用程序集可能是不同的,因此在4.5的引用程序集中不会看到4.6中添加的特定属性。除非这些引用程序集在运行时系统上可用,否则没有办法避免这些警告,只能抑制它们,例如使用#pragma

但是如果编译发生在运行时系统上,那么我不得不不同意你的断言:

然而,我们的应用程序的目标是。net 4.5.0,所以新的处理方式是无关紧要的。

你正在编译你的脚本针对。net 4.6程序集,所以新的方式做事情是非常相关的。如果在运行时系统上编译,可以动态检测新的构造函数是否可用,如果可用,就使用它。您的应用程序可能是针对。net 4.5构建的,但您的脚本不是,或者至少不总是这样。