一个启用了LINQ的应用程序能够在只安装了.NET 2.0运行时的机器上运行吗?
从理论上讲,LINQ仅仅是一种语法糖,生成的IL代码应该与在.NET 2.0中生成的代码相同。
我如何在不使用.NET 3.5库的情况下编写LINQ?它能在.NET 2.0上运行吗?
有一些“技巧”可以使用来自3.5框架的System.Core.dll使其在.net 2.0上运行,但个人不希望使用这种有点不稳定的基础。
请看此处:.NET 2.0上的LINQ支持
- 创建新的控制台应用程序
- 仅保留System和System.Core作为引用程序集
- 将System.Core的复制本地设置为true,因为它在.NET 2.0中不存在
- 在Main方法中使用LINQ查询。例如下面的查询。
- 构建
- 将所有bin输出复制到仅安装了.NET 2.0的机器上
- 运行
(需要.net 2.0 SP1,我不知道捆绑System.Core.dll是否违反EULA)
理论上是可以的,只要你分发LINQ特定程序集和任何依赖项。然而,这违反了微软的许可协议。Scott Hanselman撰写了一篇关于在ASP.NET 2.0上部署ASP.NET MVC的博客文章,类似于你所想要做的事情。
您可以使用来自Mono(.NET for Linux)的LINQ源代码在.NET 2.0上运行LINQ。
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
简短回答:
IEnumerable<T>
)IQueryable<T>
)请查看此问题,了解在使用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扩展和几个委托声明(Action和Func系列),并已在LINQBridge(如mausch所提到的)中实现。LINQ to XML和LINQ to DataSets依赖于LINQ to Objects,我想这也可以为.Net 2.0实现,但我还没有看到这样做。我对C#不是很确定。
然而,我知道只要使用VS 2008编译器针对2.0框架,就可以编写没有3.5库的VB LINQ代码。
但是,你需要自己实现一些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