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.SystemNetworkInterface.GetIPv4Statistics() 处指定的文件.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 源)

堆栈跟踪:在 System.Net.NetworkInformation.SystemNetworkInterface.GetIPv4Statistics() 在 System.Net.NetworkInformation.SystemIPv4InterfaceStatistics.GetIfEntry(Int64 index) 在 System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 源)

我一直无法找到任何可能提供对该错误的一些见解的文档。

4

1 回答 1

2

偶尔

我想知道为什么它偶尔会发生。你使用如图所示的代码吗?来自 .NET 3.5的方法SystemIPv4InterfaceStatistics.GetIfEntry(Int64 index)调用 .NET 中的GetIfEntry函数Iphlpapi.dll。从 .NET 4 开始,GetIfEntry2调用该函数。根据您的堆栈跟踪,我假设您使用的是 .NET 3.5。

错误 2,翻译为“系统找不到指定的文件”(但实际上只是ERROR_NOT_FOUND)在将未知索引传递到时返回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 连接时,我有一个额外的界面将被打印出来。第二次我禁用此连接,该GetIPv4Statistics()接口上的将抛出您提到的异常。

我想这取决于你在运行这段代码的机器上做什么。我认为NetworkInterface.GetAllNetworkInterfaces()每次要获取接口数据时都必须调用。

于 2012-10-20T11:39:29.053 回答