Ориентация VS2008 на.NET 2.0 не мешает мне использовать функции C# 3
У меня было решение VS2005 и я хотел снять VS2005 на новый год. Я был в основном доволен процессом обновления и был приятно удивлен, увидев, что мои сценарии сборки в основном все еще работают.
Мой вопрос касается функции многоцелевого таргетинга - у меня не установлено.NET 3.5 на моих серверах, поэтому я должен продолжать ориентироваться на.NET 2.0. В основном это сработало, но я обнаружил, что могу делать такие вещи, как
var returnMe = "result: " + result.ToString();
... и все еще успешно отлаживать проект.
Когда я получил этот код на сервере сборки, сборка не удалась, сказав, что "var" не был определен.
Так чего же мне ожидать?
- VS2008, ориентированный на.NET 2.0, должен выдавать ошибки, когда я пытаюсь сделать C# 3
- сервер сборки, зная, что я нацеливаюсь на.NET 2.0, должен понимать, что я делаю, и собирать его в 2.0-совместимый двоичный файл
Есть идеи?
5 ответов
Проблема заключается в том, что на сервере сборки нет нужного компилятора. Вы можете построить его на своей рабочей станции, верно?
Многие из "функций".NET 3.0 - это просто синтаксические биты, которые возвращаются к коду CLR 2 во время компиляции. var
является одним из них - когда он компилируется, компилятор преобразует var в соответствующий тип.
Об этом есть довольно информативный пост на http://weblogs.asp.net/shahar/archive/2008/01/23/use-c-3-features-from-c-2-and-net-2-0-code.aspx
Когда вы используете Visual Studio 2008 для целевой среды выполнения 2.0, вы все еще используете версию компилятора C# 3.0 для компиляции кода. Сама среда выполнения CLR не сильно изменилась в период между 2005 и 2008 годами. На самом деле это всего лишь пакет обновления для ядра CLR и добавление нескольких новых библиотек (в частности, System.Core.dll).
Таким образом, большинство функций, добавленных в 2008 году, прекрасно работают во время выполнения 2.0. Это абсолютно законно, и если вы попытаетесь использовать функцию, которая не работает в 2.0, вы столкнетесь с ошибкой либо во время сборки, либо во время публикации.
Как уже говорили другие, функции C# 3.0 можно использовать при настройке среды выполнения.NET 2.0 с помощью компилятора C# 3.0.
Малоизвестный факт, связанный с этим, заключается в том, что вы даже можете использовать LINQ с.NET 2.0, если предоставите свою собственную реализацию LINQ.
Вот пример, который включает операторы "выбор" и "где":
namespace System.Runtime.CompilerServices
{
// defining this attribute allows using extension methods with .NET 2.0
[AttributeUsage(AttributeTargets.Method)]
public sealed class ExtensionAttribute : Attribute {}
}
namespace System
{
public delegate R Func<A, R>(A arg0);
}
namespace System.Linq
{
public static class Enumerable
{
public static IEnumerable<R> Select<T, R>(this IEnumerable<T> input, Func<T, R> f)
{
foreach (T element in input)
yield return f(element);
}
public static IEnumerable<T> Where<T>(this IEnumerable<T> input, Func<T, bool> f)
{
foreach (T element in input) {
if (f(element))
yield return element;
}
}
}
Вы можете отправить Mono версию System.Core вместе с вашим приложением, если вы хотите в полной мере использовать LINQ в.NET 2.0.
Если вы не используете следующие библиотеки / технологии:
- Windows Presentation Foundation (WPF)
- Windows Communication Foundation (WCF)
- Windows Workflow Foundation (WWF)
- Windows CardSpace (WCS)
тогда вы более или менее в безопасности, хотя я все равно рекомендую провести тщательное тестирование.
Вы можете использовать такие функции.Net 3.0, как var
и т.д. только потому, что VS2008 не заботится о целевой версии фреймворка, когда речь идет о таких вещах, как проверка синтаксиса на лету, IntelliSence и, возможно, другие. И насколько я знаю, VS2010 будет обращать внимание на эти вещи, которые не позволят вам успешно скомпилировать ваши "var x = ...
"конструкции при нацеливании на версию 2.0 фреймворка.
Если вы хотите нацелиться на конкретную сборку, вы можете сделать это через настройки конфигурации (это именно то, что я только что прочитал для экзамена 70-536, очень сухие вещи!).
Добавьте что-то вроде следующего в ваш файл app.exe.config
<configuration>
<startup>
<requiredRuntime version="v2.0.50727"/>
</startup>
</configuration>
Затем вы можете принудительно заставить все ваши сборки использовать одну и ту же версию независимо от компьютера, что также должно помочь отладке использовать правильную версию.