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.csコンパイルしようとしましたmcs Test.cs

  • 古いバージョン2.0gmcsは機能しましたが、 代わりにを使用する必要がありmcsました。Mono 2.0 で実行可能ファイルを正常に実行できました。(.Net 2.0 で実行しようとすると、予想どおり、例外が発生しました。)
  • バージョン2.10.9および3.0.1-betaの場合、 何も起こりませんでした: exe は作成されず、エラー メッセージは表示されませんでした。これらのバージョンは Windows XP で動作し、コードをコンパイルして実行可能ファイルを実行できました。

質問: Windows 2000 は引き続き Mono でサポートされますか? バージョン 2.0 と 3.0 の間で Mono に何が起こったのか、上記のコンパイルの問題を説明できますか? 最新バージョンを 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 が見つからない

私の場合、エラー報告とワトソン博士がオフになっているため、エラー メッセージはおそらく Windows によって飲み込まれます (エラー報告によって重要なプログラムがハングする工業用 PC でテストを行いました)。オンにしようとしましたが、エラー メッセージは表示されず、何もせずに停止しましたmonomcsそれにもかかわらず、これはバージョン関連の重大なバグであり、私の場合はバージョンが同じであるため、これが問題だと思います。

Mono 開発者の Zoltan Varga は、バグ レポートに次のコメントを追加しました。

freeaddrinfo とは異なり、getaddrinfo は実際には mono の一部で必要とされるため、一部の機能を無効にしない限りその使用を避けることはできません。MSDN は Wspiapi.h を含めることを提案していますが、これは MS の Platform SDK の一部であるため実行できず、mono のリリースをコンパイルするために使用する cygwin/mingw には含まれていません。そのため、おそらく Windows で独自のバージョンの mono をコンパイルして、これらの問題を回避する必要があります。

Zoltan が参照した MSDN によって提案された解決策は次のとおりです。

Windows 2000 以前のバージョンでの getaddrinfo のサポート・Windows XP以降のWs2_32.dllにgetaddrinfo関数を追加しました。以前のバージョンの Windows でこの関数を使用するアプリケーションを実行するには、Ws2tcpip.h および Wspiapi.h ファイルを含める必要があります。Wspiapi.h インクルード ファイルが追加されると、getaddrinfo 関数が Wspiapi.h ファイルの WspiapiGetAddrInfo インライン関数に定義されます。実行時に、Ws2_32.dll または Wship6.dll (Windows 2000 の IPv6 Technology Preview の getaddrinfo を含むファイル) に getaddrinfo が含まれていない場合、getaddrinfo のバージョンがインラインで実装されるように、WspiapiGetAddrInfo 関数が実装されます。 Wspiapi.h ヘッダー ファイルのコードに基づいています。このインライン コードは、getaddrinfo 関数をネイティブにサポートしていない古い Windows プラットフォームで使用されます。

このバグは 2010 年に報告され、優先度 5 になり、それ以来解決されていません。これは基本的に、誰かがこのバグを解決するまで、Windows 2000 は Mono バージョン >=2.6 でサポートされないことを意味します。

(MSDN によって提案された変更を適用し、 VS2005 を使用して Mono 3.0 を再構築しようと計画していますが、これは簡単な作業ではないようです。成功した場合は、回答を更新します。)

于 2012-11-15T16:40:50.040 に答える
2

.NET 3.5 の優れた機能のほとんどを利用するために、.NET 2.0 よりも新しいものは必要ありません。.NET 2.0 を対象とする場合でも、Visual Studio 2008-2012 に含まれる C# 3 コンパイラによって、型推論、ラムダ メソッドなどがサポートされます。

しかし、ここに重要なリンクがあります (しゃれが意図されています ;) ): http://code.google.com/p/linqbridge/ LinqBridge は、.NET 2.0 での完全な Linq-to-Objects サポートを提供します。

于 2012-11-15T12:53:47.977 に答える