Pregunta

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

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

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

¿Fue útil?

Solución

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

Mira aquí: Soporte LINQ en .NET 2.0

  1. Crear una nueva aplicación de consola
  2. Mantenga solo System y System.Core como ensamblajes a los que se hace referencia
  3. Establezca Copiar local en verdadero para System.Core, porque no existe en .NET 2.0
  4. Utilice una consulta LINQ en el método principal.Por ejemplo el de abajo.
  5. Construir
  6. Copie toda la salida del contenedor a una máquina donde solo esté instalado .NET 2.0
  7. Correr

(Requiere .net 2.0 SP1 y no tengo idea si agrupar System.Core.dll viola el EULA)

Otros consejos

Es raro que nadie lo haya mencionado. Puente LINQ.Este pequeño e increíble proyecto es un backport de LINQ (IEnumerable, pero sin IQueryable) y sus dependencias (Func, Action, etc.) para .NET 2.0.Y:

Si su proyecto hace referencia a Linqbridge durante la compilación, se unirá a los operadores de consultas de Linqbridge;Si hace referencia al sistema.

En teoría, sí, siempre que distribuya los ensamblados específicos de LINQ y sus dependencias.Sin embargo, esto constituye una violación de la licencia de Microsoft.Scott Hanselman escribió una publicación de blog sobre Implementación de ASP.NET MVC en ASP.NET 2.0 que es similar a lo que quieres hacer.

Puede utilizar 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 para .NET 2.0

Respuesta corta:

  • LINQ a objetos:Sí (IEnumerable<T>)
  • LINQ a SQL/Entidades:No (IQueryable<T>)
  • LINQ a XML/Conjuntos de datos:¿aún no?

Ver esta pregunta acerca de las funciones de .Net 3.5 disponibles automáticamente o con poco esfuerzo al apuntar a .Net 2.0 desde VS2008.

Básicamente, cualquier cosa que sea sólo "azúcar de sintaxis" y los nuevos compiladores (C# 3.0, VB 9.0) emitan como IL compatible con 2.0 funcionará.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 funciones de LINQ utilizan clases, interfaces, delegados y métodos de extensión que se encuentran en los nuevos ensamblados 3.5 (como System.Core.dll).Redistribuir estos ensamblajes es una violación de la licencia, pero podrían volverse a implementar.Para utilizar métodos de extensión sólo es necesario declarar un espacio vacío. System.Runtime.CompilerServices.ExtensionAttribute.LINQ to Objects se basa en IEnumerable<T> extensiones y varias declaraciones de delegados (el Action<T> y Func<T> familias) y se han implementado en Puente LINQ (como mausoleo 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 hecho.

LINQ to SQL y LINQ to Entities requieren muchas clases nuevas (DataContext/ObjectContext, muchos atributos, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc) y árboles de expresión, que, incluso si se reimplementan de alguna manera, probablemente requerirán al menos .Net 2.0 SP1 para funcionar.

No estoy seguro acerca de C#.

Sin embargo, sí sé que puedes escribir código VB LINNQ sin las bibliotecas 3.5 siempre que uses el compilador VS 2008 para apuntar al marco 2.0.

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

LINQ utiliza una transformación sintáctica para traducir consultas a código ejecutable.Básicamente, necesitará un 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 LINQ que se incluye con el marco 3.5, esos métodos se implementan como métodos de extensión en IEnumerable o IQueryable (también hay varios métodos que funcionan en conjuntos de datos).

Los métodos de extensión IEnumerable predeterminados se definen en System.Linq.Enumerable y tienen este aspecto:

<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 árboles de expresiones como argumentos, en lugar de lambdas.Se ven así:

 <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

Las versiones del árbol de expresiones le permiten obtener una representación en árbol de las expresiones proporcionadas a las cláusulas que luego pueden usarse para generar código SQL (o cualquier otra cosa que desee).

Probablemente puedas crear tu propia versión de LINQ para objetos en aproximadamente un día.Todo es bastante sencillo.

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

No, porque si bien pensaba que LINQ en realidad era solo azúcar sintáctico, en realidad usaba mucho árboles de expresión, una característica ausente en .NET 2.0.

Dicho esto, .NET 3.5 sólo se construye sobre .NET 2.0, y esa es la razón por la que IL no parece "diferente" o "especial".

No veo ninguna razón por la que no debas simplemente instalar .NET 3.5 Framework.Todo .NET 2.0 funcionará bien, lo prometo :)

Hasta donde yo sé, la biblioteca LINQ solo está disponible desde el marco 3.0.Si desea utilizar algo similar en el marco 2.0, deberá reescribirlo usted mismo :) o buscar una biblioteca de terceros similar.solo encontré un poco de información aquí pero tampoco me convenció.

Puedes usar puentelinq para .net 2.0

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top