2

次の式は、以下の例外をスローすることがあります。

NetworkInterface[] interfacesToUse = (from outer in NetworkInterface.GetAllNetworkInterfaces()
                                                  select outer).ToArray();

IPv4InterfaceStatistics[] stats = (from current in interfacesToUse select current.GetIPv4Statistics()).ToArray();

基本例外タイプ:System.Net.NetworkInformation.NetworkInformationException(0x80004005):システムは、System.Net.NetworkInformation.SystemNetworkInterface.GetIPv4Statistics()のSystem.Net.NetworkInformation.SystemIPv4InterfaceStatistics.GetIfEntry(Int64インデックス)で指定されたファイルをシステムで見つけることができません。 .Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)

スタックトレース:System.Net.NetworkInformation.SystemIPv4InterfaceStatistics.GetIfEntry(Int64 index)at System.Net.NetworkInformation.SystemNetworkInterface.GetIPv4Statistics()at System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)

このエラーについての洞察を提供する可能性のあるドキュメントを見つけることができませんでした。

4

1 に答える 1

2

たまに

なぜたまに起こるのだろうか。示されているコードを使用していますか?SystemIPv4InterfaceStatistics.GetIfEntry(Int64 index).NET 3.5のメソッドは、のGetIfEntry関数を呼び出しますIphlpapi.dll。.NET 4以降、関数GetIfEntry2が呼び出されます。スタックトレースによると、.NET3.5を使用していると思います。

ERROR_NOT_FOUND不明なインデックスがに渡されると、「システムは指定されたファイルを見つけることができません」(実際にはただの)に変換されるエラー2が返されGetIfEntry()ます。

これは.NETでは発生しないNetworkInterface.GetAllNetworkInterfaces()はずです。システムにすでに認識されているネットワークインターフェイスのみを返す必要があるため、それらのすべての(プライベート)indexプロパティをシステムに認識されているインデックスに設定する必要があります。


編集:このコードを使用して、エラーを再現しました:

var interfaces = NetworkInterface.GetAllNetworkInterfaces();

while (true)
{

    foreach (var i in interfaces)
    {
        var s = i.GetIPv4Statistics();

        Console.WriteLine("Received: {0}, Sent: {1}", s.BytesReceived, s.BytesSent);
    }                
}

VPN接続を開始すると、印刷される追加のインターフェイスがあります。2番目にこの接続を無効にすると、GetIPv4Statistics()そのインターフェイスであなたが言及した例外がスローされます。

このコードが実行されているマシンで何をしているかによると思います。NetworkInterface.GetAllNetworkInterfaces()インターフェイスデータを取得するたびに電話をかける必要があると思います。

于 2012-10-20T11:39:29.053 に答える