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

У меня было решение 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 ]

5 голосов
/ 22 января 2010

Проблема заключается в том, что на сервере сборки нет нужного компилятора. Вы можете построить его на своей рабочей станции, верно?

Многие из «функций» .NET 3.0 - это просто синтаксические биты, которые возвращаются к коду CLR 2 во время компиляции. var является одним из них - при компиляции компилятор преобразует переменную в соответствующий тип.

На этот счет есть довольно информативный пост: http://weblogs.asp.net/shahar/archive/2008/01/23/use-c-3-features-from-c-2-and-net-2-0-code.aspx

1 голос
/ 22 января 2010

Как уже говорили, функции C # 3.0 можно использовать при настройке среды выполнения .NET 2.0 с помощью компилятора C # 3.0.

Малоизвестный факт, связанный с этим, заключается в том, что вы даже можете использовать LINQ с .NET2.0, если вы предоставите свою собственную реализацию LINQ.

Вот пример, который включает операторы 'select' и 'where':

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.

1 голос
/ 22 января 2010

Когда вы используете Visual Studio 2008 для целевой среды выполнения 2.0, вы все еще используете версию компилятора C # 3.0 для компиляции кода. Сама среда выполнения CLR не сильно изменилась в период между 2005 и 2008 годами. На самом деле это всего лишь пакет обновления для ядра CLR и добавление нескольких новых библиотек (в частности, System.Core.dll).

Таким образом, большинство функций, добавленных в 2008 году, прекрасно работают во время выполнения 2.0. Это абсолютно законно, и если вы попытаетесь использовать функцию, которая не работает в 2.0, вы столкнетесь с ошибкой во время сборки или публикации.

0 голосов
/ 22 января 2010

Если вы не используете следующие библиотеки / технологии:

  • 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 платформы.

0 голосов
/ 22 января 2010

Если вы хотите нацелиться на конкретную сборку, вы можете сделать это через настройки конфигурации (это именно то, что я только что прочитал для 70-536 экзаменов, очень сухая штука!).

Добавьте что-то вроде следующего в файл app.exe.config

<configuration>
   <startup>
      <requiredRuntime version="v2.0.50727"/>
   </startup>
</configuration>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...