好老的Win2k,the highest supported version of the .NET Framework is 2.0。如果想运行现代C#应用程序(例如,使用LINQ),Mono Framework可能是解决方案。不幸的是,目前尚不清楚Mono是否支持Windows 2000。 Download page表示最新版本(3.0.1-beta)“适用于所有版本的Windows XP,2003,Vista和Windows 7”,但安装程序显示的发行说明声称“此版本在Windows上运行2000年或以后“。
作为一个快速测试,我尝试使用不同版本的Mono(2.0,2.10.9,3.0.1-beta)在Win2k盒子上编译并运行以下代码:
// Test.cs
using System;
using System.Linq;
public static class Test
{
public static void Main()
{
Console.WriteLine(Environment.Version);
int[] numbers1 = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var numbers2 = from number in numbers1 where number < 5 select number;
Func<int, int> negate = number => -1 * number;
foreach (var number in numbers2)
Console.WriteLine(negate(number));
}
}
我打开了Mono命令提示符,将工作目录更改为Test.cs
的目录,并尝试按mcs Test.cs
编译它。
gmcs
而不是mcs
。我可以在Mono上成功运行可执行文件
2.0。 (当我尝试在.Net 2.0上运行它时,我得到了一个例外,正如我预期的那样。)问题: Mono仍然支持Windows 2000吗?版本2.0和3.0之间的Mono发生了什么,这可以解释上面提到的编译问题?如何才能使最新版本在Win2k上运行?
答案 0 :(得分:4)
我尝试了2.0和3.0之间的每个次要版本。我发现版本&lt; = 2.4工作,但版本&gt; = 2.6没有。我查看了Release Notes for v2.6,但找不到任何可以解释这一点的内容。然后我用谷歌搜索“mono 2.6 windows 2000”,发现有一个critical bug on Windows 2000:
在Windows 2000中的WS2_32.DLL中找不到入口点getaddrinfo
在我的情况下,错误报告和Dr. Watson已关闭,因此Windows可能会吞下错误消息(我在工业PC上进行了测试,其中错误报告会使重要程序挂起)。我试图打开它,但我仍然没有收到任何错误消息 - mono
和mcs
只是停止而不做任何事情。尽管如此,我认为这是问题所在,因为这是一个与版本相关的show-stopper错误,在我的例子中版本是相同的。
Mono开发人员Zoltan Varga在错误报告中添加了以下评论:
与freeaddrinfo不同,getaddrinfo实际上是部分单声道所必需的 如果不禁用某些功能,则无法避免使用。 MSDN建议 包括Wspiapi.h,我们不能这样做,因为它是MS的Platform SDK的一部分, 它不在cygwin / mingw中,我们用它来编译mono的发行版。所以 你可能需要在Windows上编译自己的mono版本并工作 围绕这些问题。
Zoltan提到的solution suggested by MSDN如下:
在Windows 2000及更早版本上支持getaddrinfo - 在Windows XP及更高版本中,getaddrinfo函数已添加到Ws2_32.dll。要在早期版本的Windows上执行使用此功能的应用程序,则需要包含Ws2tcpip.h和Wspiapi.h文件。添加Wspiapi.h包含文件时,getaddrinfo函数定义为Wspiapi.h文件中的WspiapiGetAddrInfo内联函数。在运行时,WspiapiGetAddrInfo函数的实现方式是,如果Ws2_32.dll或Wship6.dll(在Windows 2000的IPv6技术预览中包含getaddrinfo的文件)不包含getaddrinfo,则getaddrinfo的内联版本实现基于Wspiapi.h头文件中的代码。此内联代码将用于本身不支持getaddrinfo函数的旧Windows平台。
此错误已于2010年提交,优先级为5,此后尚未解决。这基本上意味着在有人解决此错误之前,Mono版本&gt; = 2.6 不支持 Windows 2000。
(我打算尝试应用MSDN和rebuild Mono 3.0 using VS2005建议的修改,但这似乎不是一件容易的事。如果我成功了,我会更新我的答案。)
答案 1 :(得分:2)
您不需要比.NET 2.0更新的东西来获得大多数漂亮的.NET 3.5功能。 即使面向.NET 2.0,Visual Studio 2008-2012中包含的C#3编译器也支持类型推断,lambda方法等。
但这里是重要的链接(双关语;)):http://code.google.com/p/linqbridge/ LinqBridge为您提供.NET 2.0上完整的Linq-to-Objects支持。