2008-08-05 35 views
52

Czy aplikacja obsługująca LINQ może działać na komputerze z zainstalowanym środowiskiem .NET 2.0?LINQ w środowisku .NET 2.0 Runtime

Teoretycznie LINQ to nic innego jak cukier syntaktyczny, a wynikowy kod IL powinien wyglądać tak samo, jak w .NET 2.0.

Jak mogę napisać LINQ bez korzystania z bibliotek .NET 3.5? Czy uruchomi się .NET 2.0?

Odpowiedz

32

Istnieje kilka "hacków", które wymagają użycia System.Core.dll z 3.5 Framework, aby uruchomić go z .net 2.0, ale osobiście nie chciałbym chcą korzystać z tak chwiejnej podstawy.

Zobacz tutaj: LINQ support on .NET 2.0

  1. Utwórz nową aplikację konsoli
  2. Przechowywać wyłącznie System i System.Core jako odwołuje zespołów
  3. Set Copy lokalne true dla System.Core, bo to robi nie istnieje w .NET 2.0
  4. Użyj zapytania LINQ w metodzie głównej. Na przykład ten poniżej.
  5. Budowanie
  6. skopiować wszystkie wyjścia bin na komputerze, na którym jest zainstalowany .NET 2.0 tylko
  7. Run

(Wymaga .NET 2.0 SP1 i nie mam pojęcia, czy łączenie systemu. Core.dll narusza EULA)

+37

redystrybucja System.Core.dll jest naruszeniem licencji Microsoft – Lucas

+0

po zbudowaniu i uruchomieniu, nie ma nic w folderze bin, z wyjątkiem folderu debugowania. :(Buduję aplikację Console w .Net 4.0 visual studio 2010. –

+0

@ JonasT Jeśli korzystasz z .net 4.0, to w ogóle nie dotyczy ciebie, ponieważ chodzi o .net 2.0 używając LINQ. oddzielne pytanie, podając szczegóły dotyczące konfiguracji –

3

Nie, ponieważ podczas gdy myślałeś, że LINQ jest tak naprawdę cukrem syntaktycznym, to w rzeczywistości używał silnie drzewek ekspresji - funkcja nieobecna w .NET 2.0.

Powiedziawszy, że .NET 3.5 buduje tylko na .NET 2.0, i to jest powód, dla którego IL nie wygląda "inny" lub "specjalny".

Nie widzę powodu, dla którego nie powinieneś instalować programu .NET 3.5 Framework. Wszystko .NET 2.0 sprawdzi się dobrze, obiecuję :)

+1

.Net 3.0 lub wyższej nie można zainstalować na Windows 2000. – Lamar

+1

uwaga: wyrażenie drzewa są używane przez IQueryable (jak w LINQ do SQL), ale nie przez IEnumerbale (jak w LINQ to Objects) – Lucas

+0

Plus, w świecie "Korporacyjnym", mamy dosłownie maszyny, które nie zostały "uaktualnione" do ".NET 2.0". Tak. Poważnie, robimy. – cbmeeks

11

Teoretycznie tak, pod warunkiem, że dystrybuowane są specyficzne zespoły LINQ i wszelkie zależności. Jest to jednak niezgodne z licencją Microsoft. Scott Hanselman napisał blog o numerze Deploying ASP.NET MVC on ASP.NET 2.0, który jest podobny do tego, co chcesz zrobić.

2

O ile mi wiadomo, biblioteka LINQ jest dostępna tylko od wersji 3.0. Jeśli chcesz użyć czegoś podobnego w ramce 2.0, musisz napisać to samemu :) lub znaleźć podobną bibliotekę strony trzeciej. Znalazłem tylko trochę informacji here, ale też mnie to nie przekonało.

+0

framework 3.5, tak naprawdę nie 3.0 – Lucas

5

Nie jestem pewien co do C#.

Wiem jednak, że można napisać kod VB LINNQ bez biblioteki 3.5, o ile używa się kompilatora VS 2008 do kierowania ramą 2.0.

Będziesz jednak musiał sam wdrożyć niektóre metody LINQ.

LINQ wykorzystuje przekształcenie syntetyczne do tłumaczenia zapytań na kod wykonywalny.Zasadniczo, to zajmie kod tak:

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

i przekształcić go w kodzie tak:

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

Dla funkcjonalności LINQ, że statki o 3,5 ram, metody te są implementowane jako metody wewnętrznych na albo IEnumerable, albo IQueryable (jest też kilka metod, które działają również na zbiory danych).

Domyślne IEnumerable rozszerzenie metod są zdefiniowane w System.Linq.Enumerable i wyglądać tak:

<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 

W IQueryable rozszerzenie metod wziąć wyrażeń drzew jako argumenty, zamiast lambda. Wyglądają tak: wersje drzewo

<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 

Wyrażenie pozwalają uzyskać reprezentację drzewa wyrażeń określonych klauzul, które mogą być następnie wykorzystywane do generowania kodu SQL (czy co tam jeszcze chcesz).

Prawdopodobnie można utworzyć własną wersję LINQ do obiektów w około dzień. Wszystko jest całkiem proste.

Jeśli chcesz używać DLINQ, to będzie trochę trudniej.

+0

+1, należy jednak pamiętać, że drzewa wyrażeń (dla IQueryable) są dostępne tylko w wersji 3.5 + – Lucas

+0

.. i tak, wszystko, co powiedzieliście o VB 9.0, dotyczy C# 3.0 (przy użyciu nowego kompilatora, ale kieruje na starszą wersję fx). – Lucas

+0

Ale możesz napisać własną implementację drzewa ekspresji, jeśli chcesz. –

75

To dziwne, że nikt nie wspomniał o LINQBridge. Ten mały, świetny projekt to backport LINQ (IEnumerable, ale bez IQueryable) i jego zależności (Func, Action, itp.) Do .NET 2.0. Oraz:

Jeśli referencje projektu LINQBridge podczas kompilacji, to będzie wiązać do operatorów zapytań LINQBridge za; jeśli to odniesie się do kompilacji System.Core podczas kompilacji , to zostanie powiązane z operatorami zapytań Framework 3.52 z .

+2

+1 Używam tego dużo. Uwaga: jest to implementacja LINQ to Objects (IEnumerable extensions), działa idealnie, jeśli używasz struktury kierowania VS2008 (C# 3.0) 2.0+. NIE jest to implementacja LINQ dla SQL lub innych dostawców LINQ. – Lucas

+1

To źle, że LINQBridge nie obsługuje Linq-2-Xml :(Linq-2-Xml sprawia, że ​​praca z Xml jest łatwa i przyjemna –

+0

@Dmitry Linq2Xml to sposób, w jaki prace wykonuje się tak szybko. Xpath jest wciąż dobrą alternatywą, ale nie tak płynnie – Jeremy

6

Krótka odpowiedź:

  • LINQ to Objects: tak (IEnumerable<T>)
  • LINQ to SQL/podmioty: brak (IQueryable<T>)
  • LINQ to XML/DataSet: nie jeszcze?

Zobacz this question o .NET 3.5 funkcje dostępne automatycznie lub przy niewielkim wysiłku, kiedy targetting .NET 2.0 z VS2008.

Zasadniczo wszystko, co jest tylko "cukrem składniowym" i nowe kompilatory (C# 3.0, VB 9.0) emitują IL zgodne z 2.0. Obejmuje to wiele funkcji używanych przez LINQ, takich jak anonimowe klasy, lambdy jako anonimowych delegatów, automatyczne właściwości, inicjalizatory obiektów i inicjatory kolekcji.

Niektóre funkcje LINQ używają klas, interfejsów, delegatów i metod rozszerzeń, które znajdują się w nowych złożeniach 3.5 (takich jak System.Core.dll). Redystrybucja tych zespołów jest naruszeniem licencji, ale można je ponownie wdrożyć.Korzystanie z metod rozszerzeń wymaga tylko zadeklarowania pustego System.Runtime.CompilerServices.ExtensionAttribute. LINQ to Objects opiera się na rozszerzeniach IEnumerable<T> i kilku deklaracjach delegatów (rodzinach Action<T> i Func<T>) i zostały zaimplementowane w LINQBridge (jak wspomniano mausch). LINQ do XML i LINQ do DataSets polegają na LINQ do Objects, które, jak sądzę, mogą zostać zaimplementowane dla .Net 2.0, ale nie widziałem tego jeszcze zrobionego.

LINQ to SQL i LINQ do podmiotów wymaga wiele nowych klas (DataContext/ObjectContext, wiele atrybutów, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc) oraz wyrażenia drzew, które, nawet jeśli w jakiś sposób przepisany, będą prawdopodobnie wymagać przynajmniej .NET 2.0 SP1 do pracy.

7

Możesz używać źródeł LINQ z mono (.NET dla Linux), aby LINQ działał na .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 

Ktoś zrobił to tutaj:
LINQ for .NET 2.0