Pergunta

Pode LINQ aplicativo habilitado para executar em uma máquina que só tem o .NET 2.0 runtime instalado?

Em teoria, o LINQ é nada mais do que um açúcar sintático, e o resultante IL código deve ter a mesma aparência que teria no .NET 2.0.

Como posso escrever LINQ sem usar .NET 3.5 bibliotecas?Será que vai correr .NET 2.0?

Foi útil?

Solução

Existem alguns "Hacks" que envolvem o uso de um System.Core.dll a partir do 3.5-Quadro para fazê-lo funcionar com .net 2.0, mas, pessoalmente, eu não gostaria de usar um pouco instável fundação.

Veja aqui: LINQ suporte .NET 2.0

  1. Criar uma nova aplicação de consola
  2. Mantenha-os apenas do Sistema e do Sistema.Núcleo como assemblies referenciados
  3. Definir a Cópia Local para true para o Sistema.O núcleo, porque ele não existe .NET 2.0
  4. Usar uma consulta LINQ no método Main.Por exemplo a abaixo.
  5. Construir
  6. Copie todos os bandeja de saída para uma máquina, onde só .NET 2.0 está instalado
  7. Executar

(Requer .net 2.0 SP1 e eu não tenho nenhuma idéia de se agrupar a System.Core.dll viola o EULA)

Outras dicas

É estranho que ninguém tenha mencionado LINQBridge.Este pequeno projeto incrível é o backport do LINQ (IEnumerable, mas sem IQueryable) e suas dependências (Func, Ação, etc.).NET 2.0.E:

Se o seu projeto de referências LINQBridge durante a compilação, em seguida, ele vai ligar para LINQBridge os operadores de consulta;se referências Sistema.Núcleo durante o a compilação, em seguida, ele irá ligar para Quadro 3.5 os operadores de consulta.

Em teoria sim, desde que você distribua o LINQ assembleias específicas e todas as dependências.No entanto, que é em violação de licenciamento da Microsoft.Scott Hanselman escreveu um post no blog sobre a A implantação de ASP.NET MVC no ASP.NET 2.0 o que é semelhante ao que você está querendo fazer.

Você pode usar o LINQ fontes de mono (.NET para Linux) para obter o LINQ execução .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

Alguém fez isso aqui:
LINQ para .NET 2.0

Resposta curta:

  • O LINQ to Objects:sim (IEnumerable<T>)
  • O LINQ to SQL/Entidades:nenhum (IQueryable<T>)
  • O LINQ to XML/Conjuntos de dados:ainda não?

Ver esta pergunta sobre .Net 3.5 recursos disponíveis automaticamente ou com um pouco de esforço quando as consequências .Net 2.0 do VS2008.

Basicamente, qualquer coisa que é só uma "sintaxe de açúcar" e os novos compiladores de C# 3.0, VB 9.0) emitir 2.0-compatível IL vai trabalhar.Isso inclui muitos recursos usados pelo LINQ como anónimo classes, lambdas como anónimo delegados, propriedades automáticas, os inicializadores de objeto, e a coleção de inicializadores.

Alguns recursos do LINQ usar classes, interfaces, delegados e métodos de extensão que vivem na nova 3.5 assembleias (como System.Core.dll).A redistribuição desses conjuntos é uma violação de licença, mas eles poderiam ser reimplementado.Usando os métodos de extensão só precisa que você declarar um vazio System.Runtime.CompilerServices.ExtensionAttribute.O LINQ to Objects depende IEnumerable<T> extensões e vários delegado declarações (o Action<T> e Func<T> as famílias) e têm sido implementadas em LINQBridge (como mausch mencionado).O LINQ to XML e LINQ para Conjuntos de dados dependem do LINQ to Objects, que eu acho que também poderia ser implementados .Net 2.0, mas eu não tenho visto isso ser feito ainda.

O LINQ to SQL e LINQ para Entidades exigem muitas novas classes (DataContext/ObjectContext, lotes de atributos, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc) e árvores de expressão, que, mesmo se de alguma forma reimplementado, provavelmente vai exigir pelo menos .Net 2.0 SP1 para o trabalho.

Eu não tenho certeza sobre C#.

Eu sei, no entanto, que você pode escrever VB LINNQ código w/saída de 3,5 bibliotecas contanto que você usar o VS 2008 compilador para segmentar o framework 2.0.

Você vai, no entanto, é necessário implementar algumas das LINQ métodos de seu self.

O LINQ utiliza um syntatic transformação para traduzir consultas em um código executável.Basicamente, vai demorar um código como este:

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

e convertê-lo em código como este:

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

Para o LINQ funcionalidade que acompanha o framework 3.5, esses métodos são implementados como métodos de extensão em um IEnumerable ou IQueryable (há também um monte de métodos que funcionam em conjuntos de dados muito).

O padrão de IEnumerable os métodos de extensão são definidos no Sistema.Linq.Enumerable e olhar como este:

<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

O IQueryable métodos de extensão tomar expressões de árvores, como argumentos, em vez de lambdas.Eles se parecem com isso:

 <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

A árvore de expressão versões permitem obter uma representação em árvore das expressões fornecidas para as cláusulas que pode então ser usado para gerar código SQL (ou que nunca mais você quiser).

Você provavelmente poderia criar a sua própria versão do LINQ to objects em cerca de um dia ou assim.Tudo é muito simples.

Se você quiser usar DLINQ, em seguida, as coisas seriam um pouco mais difícil.

Não, porque enquanto você pensou que o LINQ é realmente apenas um açúcar sintático, na verdade, muito usado árvores de expressão -- um recurso ausente .NET 2.0.

O que está sendo dito .NET 3.5 somente constrói em cima .NET 2.0, e que é a razão pela qual a IL não olhar "diferente" ou "especial".

Eu não vejo uma razão para que você não só tem que instalar os .NET Framework 3.5.Tudo .NET 2.0 irá funcionar bem sobre ele, prometo :)

Até onde eu sei o LINQ biblioteca só está disponível desde o framework 3.0.Se você quiser usar algo semelhante no framework 2.0, você precisará rewritte-se :) ou encontrar um semelhante biblioteca de terceiros.Só achei um pouco de informação aqui mas não me convenceu tanto.

Você pode usar linqbridge para .net 2.0

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top