7

在良好的旧 Win2k 上,.NET Framework 的最高支持版本是 2.0。如果想运行现代 C# 应用程序(例如,使用 LINQ),Mono 框架可能是解决方案。不幸的是,尚不清楚 Mono 是否支持 Windows 2000。下载页面显示最新版本(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.csmcs Test.cs.

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

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

4

2 回答 2

4

我尝试了 2.0 和 3.0 之间的每个次要版本。我发现版本 <=2.4 可以工作,但版本 >=2.6 不行。我查看了v2.6 的发行说明,但找不到任何可以解释这一点的东西。然后我用谷歌搜索“mono 2.6 windows 2000”,发现Windows 2000 上有一个严重的错误

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

就我而言,错误报告和 Watson 博士已关闭,因此错误消息可能会被 Windows 吞噬(我在工业 PC 上进行了测试,错误报告会使重要程序挂起)。我试图打开它,但我仍然没有收到错误消息 -mono只是mcs停止而不做任何事情。尽管如此,我相信这是问题所在,因为这是一个与版本相关的、显示停止的错误,而且在我的情况下,版本是相同的。

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

与 freeaddrinfo 不同,getaddrinfo 实际上是 mono 的一部分,因此如果不禁用某些功能就无法避免使用它。MSDN 建议包含 Wspiapi.h,我们不能这样做,因为它是 MS 平台 SDK 的一部分,并且它不在 cygwin/mingw 中,我们用于编译单声道版本。因此,您可能需要在 windows 上编译自己的 mono 版本并解决这些问题。

Zoltan 提到的 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,则内联实现一个版本的 getaddrinfo基于 Wspiapi.h 头文件中的代码。此内联代码将用于原生不支持 getaddrinfo 函数的旧 Windows 平台。

This bug was filed in 2010, got priority level 5, and has not been solved since then. This basically means that until someone solves this bug, Windows 2000 is not supported by Mono versions >=2.6.

(I'm planning to try to apply the modifications suggested by MSDN and rebuild Mono 3.0 using VS2005, but this does not seem to be an easy task. In case I succeed, I will update my answer.)

于 2012-11-15T16:40:50.040 回答
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 支持。

于 2012-11-15T12:53:47.977 回答