Windows 2000 SP4上的单声道



在旧的Win2k上,支持的最高版本。NET Framework是2.0。如果想要运行现代的C#应用程序(例如,使用LINQ),Mono Framework可能就是解决方案。遗憾的是,目前还不清楚Mono是否支持Windows2000。下载页面上说,最新版本(3.0.1-beta)"适用于Windows XP、2003、Vista和Windows 7的所有版本",但安装程序显示的发布说明声称"此版本在Windows 2000或更高版本上运行"。

作为一个快速测试,我尝试在Win2k盒子上使用不同版本的Mono(2.0、2.10.9、3.0.1-beta)编译并运行以下代码:

// 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编译它。

  • 旧版本2.0有效,我只需要使用gmcs而不是CCD_ 4。我可以在Mono上成功运行可执行文件2.0。(当我试图在.Net 2.0上运行它时,正如我所料,我遇到了一个异常。)
  • 在版本2.10.93.0.1-beta的情况下,什么都没发生:没有创建exe,也没有显示错误消息。这些版本在WindowsXP上运行,我可以编译代码并运行可执行文件

问题:Mono仍然支持Windows 2000吗?Mono在2.0和3.0版本之间发生了什么,这可以解释上面提到的编译问题?如何使最新版本在Win2k上运行?

我试用了2.0到3.0之间的每个次要版本。我发现版本<2.4版本有效,但>=2.6版本无效。我查看了v2.6的发行说明,但找不到任何可以解释这一点的东西。然后我在谷歌上搜索了"mono 2.6 windows 2000",发现windows 2000上有一个关键的错误:

在Windows 2000 的WS2_32.DLL中找不到入口点getaddrinfo

在我的情况下,错误报告和Dr.Watson被关闭,因此错误消息可能会被Windows吞噬(我在工业PC上进行了测试,错误报告会使重要程序挂起)。我试着打开它,但仍然没有收到错误消息——monomcs什么都不做就简单地停止了。尽管如此,我相信这就是问题所在,因为这是一个与版本相关的、阻止显示的错误,在我的情况下,版本是相同的。

Mono开发人员Zoltan Varga在错误报告中添加了以下评论:

与freeaddrinfo不同,getaddrinfo实际上是mono部分所必需的,因此它如果不禁用某些功能,就无法避免使用。MSDN建议包括Wspiapi.h,因为它是MS平台SDK的一部分,所以我们不能这样做,它不在cygwin/mingw中,我们使用它来编译mono的发行版。所以您可能需要在windows上编译自己版本的mono并开始工作围绕这些问题。

佐尔坦提到的MSDN建议的解决方案如下:

在Windows 2000及更早版本上支持getaddrinfo-getaddrinfo函数已添加到Windows XP及更高版本上的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,则基于Wspiapi.h头文件中的代码内联实现getaddrinfo版本。此内联代码将在本机不支持getaddrinfo函数的旧Windows平台上使用。

此错误于2010年提交,优先级为5,此后一直没有得到解决。这基本上意味着,在有人解决这个错误之前,Windows 2000不支持Mono版本>=2.6

(我计划尝试应用MSDN建议的修改,并使用VS2005重建Mono 3.0,但这似乎不是一项容易的任务。如果我成功了,我会更新我的答案。)

您不需要比更新的内容。NET 2.0来获得大部分好处。NET 3.5功能。Visual Studio 2008-2012中包含的C#编译器支持类型推断、lambda方法等,即使是在定位时也是如此。NET 2.0。

但这里有一个重要的环节(双关语;):http://code.google.com/p/linqbridge/LinqBridge在上为您提供了对对象的完整Linq支持。NET 2.0。

最新更新