支持 LINQ 的应用程序可以在仅安装了 .NET 2.0 运行时的计算机上运行吗?

理论上,LINQ 只不过是语法糖,生成的 IL 代码应该与 .NET 2.0 中的代码相同。

如何在不使用 .NET 3.5 库的情况下编写 LINQ?它会在.NET 2.0 上运行吗?

有帮助吗?

解决方案

有一些“黑客”涉及使用 3.5 Framework 中的 System.Core.dll 使其与 .net 2.0 一起运行,但就我个人而言,我不想使用这样一个有点不稳定的基础。

看这里: .NET 2.0 上的 LINQ 支持

  1. 创建一个新的控制台应用程序
  2. 仅保留 System 和 System.Core 作为引用的程序集
  3. 将 System.Core 的 Copy Local 设置为 true,因为它在 .NET 2.0 中不存在
  4. 在 Main 方法中使用 LINQ 查询。例如下面这个。
  5. 建造
  6. 将所有 bin 输出复制到仅安装 .NET 2.0 的计算机
  7. 跑步

(需要 .net 2.0 SP1,我不知道捆绑 System.Core.dll 是否违反了 EULA)

其他提示

奇怪的是没人提到 LINQ桥. 。这个很棒的小项目是 LINQ(IEnumerable,但没有 IQueryable)及其依赖项(Func、Action 等)到 .NET 2.0 的向后移植。和:

如果您的项目在编译过程中引用了Linqbridge,则它将绑定到Linqbridge的查询操作员;如果它在编译过程中引用System.Core。它将绑定到Framework 3.5的查询操作员。

理论上是可以的,前提是您分发 LINQ 特定程序集和任何依赖项。然而,这违反了微软的许可。斯科特·汉塞尔曼 (Scott Hanselman) 写了一篇关于 在 ASP.NET 2.0 上部署 ASP.NET MVC 这与您想要做的类似。

您可以使用 mono(.NET for Linux)中的 LINQ 源来让 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

有人在这里做到了:
.NET 2.0 的 LINQ

简短回答:

  • LINQ 到对象:是的 (IEnumerable<T>)
  • LINQ to SQL/实体:不 (IQueryable<T>)
  • LINQ 到 XML/数据集:还没有?

这个问题 当从 VS2008 瞄准 .Net 2.0 时,.Net 3.5 功能会自动可用或只需很少的努力即可使用。

基本上,任何只是“语法糖”和新编译器(C# 3.0、VB 9.0)作为 2.0 兼容 IL 发出的东西都可以工作。这包括 LINQ 使用的许多功能,例如匿名类、作为匿名委托的 lambda、自动属性、对象初始值设定项和集合初始值设定项。

某些 LINQ 功能使用新 3.5 程序集中的类、接口、委托和扩展方法(例如 System.Core.dll)。重新分发这些程序集会违反许可证,但它们可以重新实现。使用扩展方法只需要声明一个空的 System.Runtime.CompilerServices.ExtensionAttribute. 。LINQ to Objects 依赖于 IEnumerable<T> 扩展和几个委托声明( Action<T>Func<T> 家庭)并已实施 LINQ桥 (作为 毛施 提及)。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 才能工作。

我不确定 C#。

不过,我确实知道,只要使用 VS 2008 编译器来针对 2.0 框架,就可以编写不带 3.5 库的 VB LINNQ 代码。

但是,您必须自己实现一些 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);

对于 3.5 框架附带的 LINQ 功能,这些方法作为 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 扩展方法采用表达式树作为参数,而不是 lambda。它们看起来像这样:

 <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 object 版本。这一切都非常简单。

如果你想使用DLINQ,那么事情会有点困难。

不,因为虽然您认为 LINQ 实际上只是语法糖,但它实际上大量使用了表达式树——这是 .NET 2.0 中缺少的功能。

话虽这么说,.NET 3.5 仅构建在 .NET 2.0 之上,这就是 IL 看起来并不“不同”或“特殊”的原因。

我不认为您不应该安装 .NET 3.5 Framework。.NET 2.0 的一切都将在其上正常工作,我保证:)

据我所知,LINQ 库仅从框架 3.0 开始可用。如果你想在框架2.0中使用类似的东西,你需要自己重写:)或者找到类似的第三方库。我只找到了一点信息 这里 但这也没有说服我。

您可以使用 林克桥 对于.net 2.0

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top