日期:2014-05-18  浏览次数:20920 次

一个超高端的问题,论坛里的大牛们都进来研究下
代码中 smap 对象 如何实例化呢?
C# code


                 NATUPNPLib.IStaticPortMappingCollection mapping = nat.StaticPortMappingCollection;
                 int i = 0;
                 NATUPNPLib.IStaticPortMapping smap;
                 IEnumerator mapEm = mapping.GetEnumerator();
                 mapEm.Reset();
                 while (i < mapping.Count)
                 {
                     mapEm.MoveNext();
                     smap = mapEm.Current as IStaticPortMapping;
                     if (smap != null)
                     {
                         this.listBox1.Items.Add(smap.ExternalPort + "\t" + smap.InternalClient + "\t" + smap.Protocol + "\t" + smap.InternalPort);
                     }
                     if (smap == null)
                     {
                         break;
                     }
                     i++;
                 }






------解决方案--------------------
首先,在下不是大牛
IStaticPortMapping 貌似是NATUPNPLib对COM接口IStaticPortMapping的.net封装,至于怎么实例化,要看类库NATUPNPLib是怎么实现的
------解决方案--------------------
看了一下,这是IStaticPortMapping的声明

public interface IStaticPortMapping

它是一个接口,没法实例化
------解决方案--------------------
这是哪行出的“未将对象引用设置到对象的实例”,代码中 smap 是转换而来,不需要实例化,而且有判断,倒是 nat 和 mapping 可能报这错,简化下可以这样
C# code
NATUPNPLib.IStaticPortMappingCollection mapping = nat.StaticPortMappingCollection;
NATUPNPLib.IStaticPortMapping smap;
IEnumerator mapEm = mapping.GetEnumerator();
mapEm.Reset();
while (mapEm.MoveNext())
{
    smap = mapEm.Current as IStaticPortMapping;
    if (smap == null)
    {
        break;
    }
    this.listBox1.Items.Add(smap.ExternalPort + "\t" + smap.InternalClient + "\t" + smap.Protocol + "\t" + smap.InternalPort);
}

------解决方案--------------------
探讨
回楼上的 还是包同样的错,未将对象引用设置到对象实例
我把foreach代码贴上来 帮着看下吧 谢谢了。

C# code

//直接使用foreach循环,当MoveNext移到Count位置时,会产生异常,故采用变量i和mapcount进行控制
foreach (object n in mapping)
……

------解决方案--------------------
楼主你先单步调试,看看是哪行语句抛出的异常
------解决方案--------------------
在 mapEm.Reset() 这行设置断点,调试执行到这,观察 mapEm 是不是 null ,如果是的话 mapping.GetEnumerator() 出了问题
------解决方案--------------------
mapEm.Current as IStaticPortMapping

不知道类型兼容不兼容
------解决方案--------------------
NATUPNPLib.IStaticPortMapping smap = mapping[0, string.Empty];
C# code

            NATUPNPLib.IStaticPortMapping smap = mapping[0, string.Empty];

------解决方案--------------------
我的机子上 NATUPNPLib.IStaticPortMappingCollection mapping = nat.StaticPortMappingCollection;
mapping一直为Null。帮不了你。