LINQ on the.NET 2.0 время выполнения



может ли приложение с поддержкой LINQ работать на компьютере, на котором установлена только среда выполнения .NET 2.0?



теоретически LINQ - это не что иное, как синтаксический сахар, и полученный код IL должен выглядеть так же, как и в .NET 2.0.



Как я могу написать LINQ без использования библиотек .NET 3.5? Будет ли он работать на .NET 2.0?

686   9  

9 ответов:

есть некоторые "хаки", которые включают в себя использование системы.Ядро.dll от 3.5 Framework, чтобы заставить его работать с .net 2.0, но лично я бы не хотел использовать такой несколько шаткий фундамент.

смотрите здесь: поддержка LINQ на .NET 2.0

  1. создать новое консольное приложение
  2. держите только систему и систему.Ядро в виде ссылочных сборок
  3. установите для параметра копировать локально значение true для системы.Ядро, потому что оно не существует в .NET 2.0
  4. используйте запрос LINQ в основном методе. Например, тот, что ниже.
  5. построить
  6. скопируйте все выходные данные bin на машину, где установлен только .NET 2.0
  7. выполнить

(требуется .net 2.0 SP1, и я понятия не имею, если комплектация системы.Ядро.dll нарушает лицензионное соглашение)

странно, что никто не упомянул LINQBridge. Этот маленький удивительный проект является обратным портом LINQ (IEnumerable, но без IQueryable) и его зависимостей (Func, Action и т. д.) для .NET 2.0. И:

Если ваш проект ссылается на LINQBridge во время компиляции, то он будет связывать к операторам запросов LINQBridge; если это система ссылок.Сердечник во время компиляция, затем она будет привязана к Операторы запросов платформы 3.5.

теоретически да, при условии, что вы распространяете сборки LINQ и любые зависимости. Однако это является нарушением лицензирования Microsoft. Скотт Хансельман написал в блоге о развертывание ASP.NET MVC on ASP.NET 2.0 что похоже на то, что вы хотите сделать.

вы можете использовать источники LINQ из mono (.NET для Linux), чтобы запустить LINQ на .NET 2.0.

IEnumerable<T> : yes 
IQueryable<T>  : yes
LINQ to XML : has been working in the trunk, but due to further additions, the trunk doesn't compile anymore

кто-то сделал вот это:
LINQ для .NET 2.0

короткий ответ:

  • LINQ to Objects: yes (IEnumerable<T>)
  • LINQ to SQL / Entities: no (IQueryable<T>)
  • LINQ to XML / DataSets: еще нет?

посмотреть этот вопрос о программе .Net 3.5 с функциями, доступными автоматически или с небольшим усилием, когда вы затрагиваете .Объем 2.0 из VS2008.

в основном, все, что является только "синтаксическим сахаром" и новыми компиляторами (C# 3.0, VB 9.0) испускают как 2.0-совместимый IL будет работать. Это включает в себя множество функций, используемых LINQ, таких как анонимные классы, лямбды в качестве анонимных делегатов, автоматические свойства, инициализаторы объектов и инициализаторы коллекций.

некоторые функции LINQ используют классы, интерфейсы, делегаты и методы расширения, которые живут в новых сборках 3.5 (например, System.Ядро.файл DLL.) Распространение этих сборок является нарушением лицензии, но они могут быть переопределены. Использование методов расширения нужно только, чтобы вы объявили пустой System.Runtime.CompilerServices.ExtensionAttribute. LINQ to Objects полагается на IEnumerable<T> расширения и несколько объявлений делегатов (Action<T> и Func<T> семьи) и были реализованы в LINQBridge (как mausch упоминалось). LINQ to XML и LINQ to DataSets полагаются на LINQ to Objects, которые, я думаю, также могут быть реализованы для .Net 2.0, но я еще не видел этого.

LINQ to SQL и LINQ to Entities требуют много новых классов (DataContext/ObjectContext, много атрибутов, EntitySet<T>,EntityRef<T>,Link<T>,IQueryable<T> и т. д.) и деревья выражений, которые, даже если они каким-то образом переопределены, вероятно, потребуют работы по крайней мере .Net 2.0 SP1.

Я не уверен насчет C#.

Я знаю, однако, что вы можете написать код VB LINNQ без библиотек 3.5, если вы используете компилятор VS 2008 для целевой платформы 2.0.

вам, однако, придется реализовать некоторые из методов LINQ самостоятельно.

LINQ использует синтаксическое преобразование для перевода запросов в исполняемый код. В принципе, это займет такой код:

dim q = from x in xs where x > 2 select x*4;

и преобразовать его в код, как это:

dim q = xs.where(function(x) x > 2).select(function(x) x * 4);

для функциональности LINQ, которая поставляется с платформой 3.5, эти методы реализованы как методы расширения либо на IEnumerable, либо на IQueryable (есть также куча методов, которые также работают с наборами данных).

методы расширения IEnumerable по умолчанию определены в системе.В LINQ.Перечислимы и выглядят так:

<Extension()>
public function Select(of T, R)(source as IEnumerable(of T), transform as Func(of T, R)) as IEnumerable(of R)

   'do the transformation...

end function

методы расширения IQueryable принимают деревья выражений в качестве аргументов, а не лямбды. Они выглядят так это:

 <Extension()>
 public function Select(of T, R)(source as IQueryable<T>, transform as Expression(of Func(of T, R))
     'build a composite IQueryable that contains the expression tree for the transformation
 end function

версии дерева выражений позволяют получить древовидное представление выражений, предоставленных в предложения, которые затем могут быть использованы для создания кода SQL (или что-либо еще вы хотите).

вы, вероятно, могли бы создать свою собственную версию LINQ to objects примерно за день или около того. Это все довольно прямолинейно.

если вы хотите использовать DLINQ, то все будет немного сложнее.

нет, потому что, хотя вы думали, что LINQ-это просто синтаксический сахар, на самом деле он сильно использовал деревья выражений-функция, отсутствующая в .NET 2.0.

Это, как говорится, .NET 3.5 только накапливается поверх .NET 2.0, и именно по этой причине IL не выглядит "другим" или "особенным".

Я не вижу причины, почему вы не должны просто установить .NET 3.5 Framework. Все .NET 2.0 будет отлично работать на нем, обещаю:)

насколько я знаю, библиотека LINQ доступна только с фреймворка 3.0. Если вы хотите использовать что-то подобное в framework 2.0, вам нужно будет переписать его самостоятельно :) или найти аналогичную стороннюю библиотеку. Я только нашел немного информации здесь но это меня тоже не убедило.

можно использовать linqbridge для .net 2.0

Comments

    Ничего не найдено.