2008-08-05 25 views
52

¿Se puede ejecutar una aplicación LINQ habilitada en una máquina que solo tiene instalado el tiempo de ejecución de .NET 2.0?LINQ en .NET 2.0 Runtime

En teoría, LINQ no es más que azúcar sintáctica, y el código IL resultante debería tener el mismo aspecto que en .NET 2.0.

¿Cómo puedo escribir LINQ sin utilizar las bibliotecas .NET 3.5? ¿Funcionará en .NET 2.0?

Respuesta

32

Hay algunos "Hacks" que implican el uso de un System.Core.dll del Framework 3.5 para que se ejecute con .net 2.0, pero personalmente no lo haría quiero usar una base tan inestable.

Ver aquí: LINQ support on .NET 2.0

  1. Crear una nueva aplicación de consola
  2. Mantenga único sistema y System.Core como ensamblados de referencia
  3. Conjunto copia local en true para System.Core, porque hace no existe en .NET 2.0
  4. Use una consulta LINQ en el método Principal. Por ejemplo, el de abajo.
  5. Build
  6. copiar toda la bandeja de salida a una máquina donde sólo .NET 2.0 está instalado
  7. Run

(Requiere .NET 2.0 SP1 y no tengo ni idea de si la agrupación del sistema. Core.dll infringe el EULA)

+37

redistribuyendo System.Core.dll es una violación de la licencia de Microsoft – Lucas

+0

después de que construí y corrí, no hay nada en la carpeta bin excepto la carpeta de depuración. :(Estoy construyendo aplicación de consola en .Net 4.0 visual studio 2010. –

+0

@JonasT Si está en .NET 4.0, entonces esto no se aplica a usted en absoluto, ya que se trata de .NET 2.0 con LINQ. No dude en solicitar una pregunta separada, dando detalles sobre su configuración –

3

No, porque si bien pensaste que LINQ es realmente solo azúcar sintáctico, en realidad usó árboles de expresión de gran intensidad, una característica ausente en .NET 2.0.

Dicho esto, .NET 3.5 solo se basa en .NET 2.0, y esa es la razón por la que el IL no se ve "diferente" o "especial".

No veo una razón por la que no deba simplemente instalar .NET 3.5 Framework. Todo .NET 2.0 funcionará bien en él, promesa :)

+1

.Net 3.0 o superior no se instalará en Windows 2000. – Lamar

+1

nota: los árboles de expresión son utilizado por IQueryable (como en LINQ to SQL), pero no por IEnumerbale (como en LINQ to Objects) – Lucas

+0

Plus, en el mundo "corporativo", literalmente tenemos máquinas que no han sido "actualizadas" a '.NET 2.0'. Sí. En serio, lo hacemos. – cbmeeks

11

En teoría sí, siempre que distribuya los ensamblados específicos de LINQ y las dependencias. Sin embargo, eso es una violación de las licencias de Microsoft. Scott Hanselman escribió una publicación en el blog sobre Deploying ASP.NET MVC on ASP.NET 2.0 que es similar a lo que quiere hacer.

2

Por lo que sé, la biblioteca LINQ solo está disponible desde el framework 3.0. Si desea utilizar algo similar en el marco 2.0, deberá volver a escribirlo usted mismo :) o buscar una biblioteca de terceros similar. Solo encontré un poco de información here pero tampoco me convenció.

+0

marco 3.5, en realidad, no 3.0 – Lucas

5

No estoy seguro acerca de C#.

Sé, sin embargo, que puede escribir el código VB LINNQ sin las bibliotecas 3.5 siempre que use el compilador VS 2008 para apuntar al marco 2.0.

Sin embargo, tendrá que implementar algunos de los métodos LINQ usted mismo.

LINQ utiliza una transformación sintáctica para traducir consultas en código ejecutable.Básicamente, se tomará código como este:

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

y convertirlo en código como este:

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

Para la funcionalidad de LINQ que se incluye con el marco 3.5, esos métodos se implementan como métodos de extensión en ya sea IEnumerable o IQueryable (también hay un montón de métodos que también funcionan en conjuntos de datos). métodos de extensión IEnumerable

El defecto se definen en System.Linq.Enumerable y se ven así:

<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 

Los métodos de extensión IQueryable toman expresiones árboles como argumentos, en lugar de lambdas. Son similares a esto: las versiones de árboles

<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 

La expresión que permiten obtener una representación en árbol de las expresiones proporcionadas a las cláusulas que a continuación se pueden utilizar para generar código SQL (o lo que sea otra cosa que desee).

Probablemente se podría crear su propia versión de LINQ a objetos en aproximadamente un día o dos. Todo es bastante directo.

Si desea utilizar DLINQ, entonces las cosas serían un poco más difícil.

+0

+1, sin embargo, tenga en cuenta que los árboles de expresión (para IQueryable) solo están disponibles en 3.5+ – Lucas

+0

.. y sí, todo lo que dijiste sobre VB 9.0 se aplica a C# 3.0 (utilizando un nuevo compilador pero apuntando a una versión anterior de fx) – Lucas

+0

Pero puedes escribir tu propia implementación del árbol de expresiones si quieres. –

75

Es raro que nadie ha mencionado LINQBridge. Este pequeño y asombroso proyecto es un respaldo de LINQ (IEnumerable, pero sin IQueryable) y sus dependencias (Func, Action, etc.) a .NET 2.0. Y:

Si las referencias del proyecto LINQBridge durante la compilación, a continuación, se unirá a operadores de consulta de LINQBridge; si es hace referencia a System.Core durante la compilación , se enlazará a los operadores de consulta de Framework 3.5 de .

+2

+1 Lo uso mucho. Nota: esta es una implementación de LINQ to Objects (las extensiones de IEnumerable), funciona perfectamente si se usa VS2008 (C# 3.0) target framework 2.0+. NO es una implementación de LINQ to SQL u otros proveedores de LINQ. – Lucas

+1

Es malo que LINQBridge no sea compatible con Linq-2-Xml :(El Linq-2-Xml hace que trabajar con Xml sea fácil y agradable. –

+0

@Dmitry Linq2Xml es la forma en que trabajo tan rápido. Xpath sigue siendo una buena alternativa, pero no tan fluido. – Jeremy

6

Respuesta corta:

  • LINQ a Objetos: sí (IEnumerable<T>)
  • LINQ a SQL/Entidades: sin (IQueryable<T>)
  • LINQ to XML/conjuntos de datos: no ¿todavía?

Ver this question sobre .Net 3.5 características disponibles de forma automática o con poco esfuerzo cuando apuntan a .Net 2.0 de VS2008.

Básicamente, cualquier cosa que sea solo "azúcar de sintaxis" y los nuevos compiladores (C# 3.0, VB 9.0) emitan como IL compatibles con 2.0 funcionarán. Esto incluye muchas características utilizadas por LINQ, como clases anónimas, lambdas como delegados anónimos, propiedades automáticas, inicializadores de objetos e inicializadores de colecciones.

Algunas características LINQ utilizan clases, interfaces, delegados y métodos de extensión que viven en los nuevos ensamblados 3.5 (como System.Core.dll). La redistribución de estos ensamblajes es una violación de la licencia, pero podrían volverse a implementar.El uso de métodos de extensión solo necesita que declare un System.Runtime.CompilerServices.ExtensionAttribute vacío. LINQ to Objects se basa en extensiones IEnumerable<T> y varias declaraciones de delegado (las familias Action<T> y Func<T>) y se han implementado en LINQBridge (como mausch mencionado). LINQ to XML y LINQ to DataSets dependen de LINQ to Objects, que supongo que también podría implementarse para .Net 2.0, pero aún no lo he visto.

LINQ a SQL y LINQ a Entidades requieren muchas nuevas clases (DataContext/ObjectContext, un montón de atributos, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc) y los árboles de expresión, que, aunque de alguna manera Reimplementado, probablemente requerirá al menos .Net 2.0 SP1 para trabajar.

7

Puede usar las fuentes LINQ de mono (.NET para Linux) para ejecutar LINQ en .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 

Alguien lo ha hecho aquí:
LINQ for .NET 2.0

Cuestiones relacionadas