代码如下: 
        [DllImport("wsnmp32.dll")] 
        public static extern SNMPAPI_STATUS SnmpStrToOid(StringBuilder str, ref SMIOID oid); 
                    StringBuilder name2 = new StringBuilder(256); 
                    name2.Append("1.3.6.1.2.1.2.2.1.16"); 
                    SnmpAPI.SnmpStrToOid(name2, ref Oid); 
使用果网上很多方法都不行,SnmpAPI.SnmpStrToOid总会抛出“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”这个异常。请问各位高手怎么解决,谢谢,分数不够可以另开贴加分另外还有另一个方法也是这样出错 
        [DllImport("wsnmp32.dll")] 
        public static extern IntPtr SnmpCreateVbl(IntPtr session, ref SMIOID name, ref SMIVALUE value); vbl = SnmpAPI.SnmpCreateVbl(session_id, ref Oid, ref sv); 
这两个方法会有什么共通之处吗另外所用结构体为
    [StructLayout(LayoutKind.Sequential)] 
    public struct SMIOID 
    { 
        public uint size; 
        public IntPtr dwords; 
    }
    [StructLayout(LayoutKind.Explicit)]
    public struct SMIVALUE
    {
        [FieldOffset(0)]
        public SNMPAPI_SYNTAX type;
        [FieldOffset(4)]
        public SMIVUNION val;
    }

解决方案 »

  1.   

    或许wsnmp32.dll正在被其他文件调用参考
    http://hi.baidu.com/h_tang77/blog/item/6b510c23d58745549922ed09.html
      

  2.   

    原形修改成这样看看:
    [DllImport("Wsnmp32.dll")]
    private static extern UInt32 SnmpStrToOid([In,MarshalAs(UnmanagedType.LPTStr)] string snmpstr, [Out, MarshalAs(UnmanagedType.Struct)] out smiOID dstOID);
      

  3.   

    用GChanle pin住分配好的結構,然後再調用.
      

  4.   

                    SMIOID oid;                GCHandle ghc = GCHandle.Alloc(oid, GCHandleType.Pinned);
                    
                    StringBuilder name2 = new StringBuilder(256);
                    
                    name2.Append("1.3.6.1.2.1.2.2.1.16");
                    
                    SnmpAPI.SnmpStrToOid(name2, ref oid); 
                    
                    ghc.Free();
      

  5.   

    我只知道调用api的时候很容易报这个错误,
    可能参数转化有问题,有符号无符号的问题,楼上说的也是一种可能~
      

  6.   

        [StructLayout(LayoutKind.Sequential)]
        public struct SMIOID
        {
           public uint size;
            [MarshalAs(UnmanagedType.SysUInt, SizeConst = 32)]
           public IntPtr dwords;
        }
    不知这样行不行啊