2016-10-28 6 views
1

я создаю CSharpCodeProvider так:Как сделать CSharpCodeProvider целевой .NET 4.5.0 вместо .NET 4.6.2?

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. Вы можете преднамеренно настроить старую версию .NET на своем dev-машине благодаря «пакетам разработчиков», которые устанавливает VS. Не работает для 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