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





Нет, потому что, хотя вы думали, что LINQ - это просто синтаксический сахар, на самом деле он сильно использовал деревья выражений - функция, отсутствующая в .NET 2.0.
При этом .NET 3.5 строится только поверх .NET 2.0, и поэтому IL не выглядит «другим» или «особенным».
Я не вижу причин, по которым вам не следует просто устанавливать .NET 3.5 Framework. Все .NET 2.0 будет нормально работать, обещаю :)
примечание: деревья выражений используются IQueryable (как в LINQ to SQL), но не IEnumerbale (как в LINQ to Objects)
Кроме того, в «корпоративном» мире у нас буквально есть машины, которые не были «модернизированы» до .NET 2.0. Да. Серьезно, делаем.
Windows XP требует SP3 для установки .NET 3.0 или выше, а некоторые устройства со встроенной Windows XP обновить не так-то просто.
Есть некоторые «уловки», которые включают использование System.Core.dll из 3.5 Framework, чтобы заставить его работать с .net 2.0, но лично я бы не хотел использовать такой шаткий фундамент.
Смотрите здесь: Поддержка LINQ в .NET 2.0
- Create a new console application
- Keep only System and System.Core as referenced assemblies
- Set Copy Local to true for System.Core, because it does not exist in .NET 2.0
- Use a LINQ query in the Main method. For example the one below.
- Build
- Copy all the bin output to a machine where only .NET 2.0 is installed
- Run
(Требуется .net 2.0 SP1, и я понятия не имею, нарушает ли сборка System.Core.dll лицензионное соглашение)
распространение System.Core.dll является нарушением лицензии Microsoft
после того, как я собрал и запустил, в папке bin нет ничего, кроме папки отладки. :( Я создаю консольное приложение в Visual Studio 2010 .Net 4.0.
@JonasT Если вы используете .net 4.0, то это к вам вообще не относится, поскольку речь идет о .net 2.0 с использованием LINQ. Не стесняйтесь задать отдельный вопрос, подробно описав вашу настройку.
Спасибо, Майкл. Все, что я ищу, это выходные файлы. Я использую .net 2.0. Проблема в том, что я использую Visual Studio 2010, который не выводит никаких данных в папку bin. Могу ли я как-нибудь загрузить эти результаты?
Лицензии и патенты нарушают здравый смысл. Понятия не имею, что это зародилось в Microsoft. Все они построены на плечах предыдущих изобретений. Все принадлежит всем, и я надеюсь, что однажды это станет очевидным. Изменение мышления - необходимость, иначе мы не сможем сделать это как человечество.
Теоретически да, при условии, что вы распространяете специфические сборки LINQ и любые зависимости. Однако это нарушает лицензирование Microsoft. Скотт Хансельман написал в блоге сообщение о Развертывание ASP.NET MVC на ASP.NET 2.0, которое похоже на то, что вы хотите сделать.
Насколько мне известно, библиотека LINQ доступна только с версии 3.0. Если вы хотите использовать что-то подобное во фреймворке 2.0, вам придется переписать его самостоятельно :) или найти аналогичную стороннюю библиотеку. Я нашел только немного информации здесь, но она меня тоже не убедила.
Я не уверен насчет 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, все будет немного сложнее.
+1, однако обратите внимание, что деревья выражений (для IQueryable) доступны только в 3.5+
.. и да, все, что вы сказали о VB 9.0, применимо к C# 3.0 (с использованием нового компилятора, но с ориентацией на более старую версию fx)
Но вы можете написать свою собственную реализацию дерева выражений, если хотите.
Странно, что никто не упомянул LINQBridge. Этот замечательный проект представляет собой бэкпорт LINQ (IEnumerable, но без IQueryable) и его зависимостей (Func, Action и т. д.) Для .NET 2.0. И:
If your project references LINQBridge during compilation, then it will bind to LINQBridge's query operators; if it references System.Core during compilation, then it will bind to Framework 3.5's query operators.
+1 Я много этим пользуюсь. Примечание: это реализация LINQ to Objects (расширения IEnumerable), отлично работает при использовании платформы таргетинга VS2008 (C# 3.0) 2.0+. Это НЕ реализация LINQ to SQL или других поставщиков LINQ.
Плохо, что LINQBridge не поддерживает Linq-2-Xml :( Linq-2-Xml делает работу с Xml простой и приятной.
@Dmitry Linq2Xml - это то, как я так быстро выполняю работу. Xpath по-прежнему является хорошей альтернативой, но не так свободно.
Я только что наткнулся на BackLinq raboof.com/projects/backlinq того же автора! Кто-нибудь знает, в чем разница или какая последняя?
@ala: см. code.google.com/p/backlinq: «Источники BackLINQ были скомпилированы и объединены в проект LINQBridge и поддерживаются под его именем. В результате этот сайт проекта был удален и оставлен здесь для архивных целей. Следите за LINQBridge для дальнейших обновлений, дополнений и сообщение о проблемах ".
Единственный недостаток LinqBridge заключается в том, что при использовании LinqBridge практически невозможно использовать какую-либо хорошую среду фиксации (например, RhinoMocks или Moq) на полную мощность, поскольку им нужна ссылка на System.Core. RhinoMocks можно использовать, но его лучшая часть недоступна, так как вы не можете ссылаться на System.Core и LinqBridge одновременно.
@DmitryLobanov: настоящая проблема - это нуждающийся этих библиотек.
Если он не поддерживает IQueryable (не поддерживает), тогда в чем смысл? ? ?
@Quandary: Func, Action и «LINQ to objects» очень полезны сами по себе. Лично я использую их много больше, чем IQueryables.
Краткий ответ:
IEnumerable<T>)IQueryable<T>)См. этот вопрос о функциях .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 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 работать.
Вы можете использовать источники 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
.Net 3.0 или выше не устанавливается на Windows 2000.