Вопрос

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

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

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

Это было полезно?

Решение

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

Смотрите здесь: Поддержка LINQ в .NET 2.0

  1. Создайте новое консольное приложение
  2. Сохраняйте только System и System.Core в качестве сборок, на которые ссылаются ссылки
  3. Установите значение Copy Local равным true для System.Core, поскольку оно не существует в .NET 2.0
  4. Используйте запрос LINQ в основном методе.Например, тот, что приведен ниже.
  5. Строить
  6. Скопируйте все выходные данные bin на компьютер, где установлен только .NET 2.0
  7. Бежать

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

Другие советы

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

Если ваш проект ссылается на LINQBridge во время компиляции, то он будет привязан к операторам запросов LINQBridge;если он ссылается на System.Core во время компиляции, то он будет привязан к Операторам запросов Framework 3.5.

Теоретически да, при условии, что вы распространяете сборки, специфичные для LINQ, и любые зависимости.Однако это является нарушением лицензии Microsoft.Скотт Хансельман написал сообщение в блоге о Развертывание ASP.NET MVC на 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

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

  • ПРИВЯЗКА к объектам:ДА (IEnumerable<T>)
  • ССЫЛКА на SQL/Entities:НЕТ (IQueryable<T>)
  • ССЫЛКА на XML/DataSets:еще нет?

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

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

Некоторые функции LINQ используют классы, интерфейсы, делегаты и методы расширения, которые используются в новых сборках 3.5 (например, System.Core.dll).Распространение этих сборок является нарушением лицензии, но они могут быть реализованы повторно.При использовании методов расширения требуется только, чтобы вы объявили пустой System.Runtime.CompilerServices.ExtensionAttribute.LINQ для объектов полагается на IEnumerable<T> расширения и несколько объявлений делегатов (the 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 по умолчанию определены в System.Linq.Enumerable и выглядят следующим образом:

<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 доступна только начиная с Framework 3.0.Если вы хотите использовать что-то подобное в Framework 2.0, вам нужно будет переписать это самостоятельно :) или найти аналогичную стороннюю библиотеку.Я нашел только немного информации здесь но и это меня не убедило.

Вы можете использовать linqbridge - линкбридж для .net 2.0

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top