启用LINQ的应用程序是否可以在仅安装了.NET 2.0运行时的计算机上运行?
从理论上讲,LINQ只不过是语法糖,而得到的IL代码应该与.NET 2.0中的代码相同。
如何在不使用.NET 3.5库的情况下编写LINQ?它会在.NET 2.0上运行吗?
答案 0 :(得分:77)
没有人提到LINQBridge,这很奇怪。这个小巧的项目是LINQ(IEnumerable,但没有IQueryable)及其依赖(Func,Action等)到.NET 2.0的后端。和
如果您的项目引用了LINQBridge 在编译期间,它将绑定 到LINQBridge的查询运算符;如果它 引用System.Core期间 编译,然后它将绑定到 Framework 3.5的查询运算符。
答案 1 :(得分:33)
有一些“黑客”涉及使用3.5 Framework中的System.Core.dll使其与.net 2.0一起运行,但我个人不希望使用这种有点不稳定的基础。
- 创建新的控制台应用程序
- 仅将System和System.Core保留为引用的程序集
- 为System.Core将Copy Local设置为true,因为它在.NET 2.0中不存在
- 在Main方法中使用LINQ查询。例如下面的那个。
- 构建
- 将所有bin输出复制到仅安装了.NET 2.0的计算机
- 运行
醇>
(需要.net 2.0 SP1,我不知道捆绑System.Core.dll是否违反了EULA)
答案 2 :(得分:11)
理论上是的,只要您分发LINQ特定程序集和任何依赖项。但这违反了微软的许可。 Scott Hanselman撰写了一篇关于Deploying ASP.NET MVC on ASP.NET 2.0的博客文章,与您想要做的类似。
答案 3 :(得分:7)
您可以使用mono(Linux 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
有人在这里做过:
LINQ for .NET 2.0
答案 4 :(得分:6)
简短回答:
IEnumerable<T>
)IQueryable<T>
)在VS2008中定位.Net 2.0时,请参阅this question有关.Net 3.5自动提供的功能,或者只需很少的工作。
基本上,任何只有“语法糖”的东西和新编译器(C#3.0,VB 9.0)都会发布兼容2.0的IL。这包括LINQ使用的许多功能,例如匿名类,作为匿名委托的lambdas,自动属性,对象初始值设定项和集合初始值设定项。
某些LINQ功能使用新的3.5程序集(例如System.Core.dll)中的类,接口,委托和扩展方法。重新分发这些程序集是违反许可证的,但可以重新实现它们。使用扩展方法只需要声明一个空System.Runtime.CompilerServices.ExtensionAttribute
。 LINQ to Objects依赖于IEnumerable<T>
扩展和几个委托声明(Action<T>
和Func<T>
系列),并已在LINQBridge中实现(如mausch所述)。 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>
,{ {1}}等)和表达式树,即使以某种方式重新实现,也可能至少需要.Net 2.0 SP1才能工作。
答案 5 :(得分:5)
我不确定C#。
但是,我知道,只要您使用VS 2008编译器来定位2.0框架,您就可以编写VB LINNQ代码,而不是3.5库。但是,您必须实现一些自己的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扩展方法将表达式树作为参数,而不是lambdas。它们看起来像这样:
<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版本。这一切都很直接。
如果你想使用DLINQ,那么事情会有点困难。
答案 6 :(得分:3)
不,因为虽然你认为LINQ实际上只是语法糖,但它实际上大量使用了表达式树 - 这是.NET 2.0中没有的功能。
据说.NET 3.5只建立在.NET 2.0之上,这就是为什么IL看起来不那么“不同”或“特殊”的原因。
我没有看到你不应该只安装.NET 3.5 Framework的原因。一切.NET 2.0都能正常运行,承诺:)
答案 7 :(得分:2)
据我所知,LINQ库仅在框架3.0之后才可用。 如果你想在框架2.0中使用类似的东西,你需要自己重写:)或者找一个类似的第三方库。我只找到了一些信息here,但它也没说服我。
答案 8 :(得分:0)
您可以将linqbridge 用于.net 2.0