Ориентация VS2008 на.NET 2.0 не мешает мне использовать функции C# 3

У меня было решение VS2005 и я хотел снять VS2005 на новый год. Я был в основном доволен процессом обновления и был приятно удивлен, увидев, что мои сценарии сборки в основном все еще работают.

Мой вопрос касается функции многоцелевого таргетинга - у меня не установлено.NET 3.5 на моих серверах, поэтому я должен продолжать ориентироваться на.NET 2.0. В основном это сработало, но я обнаружил, что могу делать такие вещи, как

var returnMe = "result: " + result.ToString();

... и все еще успешно отлаживать проект.

Когда я получил этот код на сервере сборки, сборка не удалась, сказав, что "var" не был определен.

Так чего же мне ожидать?

  1. VS2008, ориентированный на.NET 2.0, должен выдавать ошибки, когда я пытаюсь сделать C# 3
  2. сервер сборки, зная, что я нацеливаюсь на.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>

Затем вы можете принудительно заставить все ваши сборки использовать одну и ту же версию независимо от компьютера, что также должно помочь отладке использовать правильную версию.

Другие вопросы по тегам