代码之家  ›  专栏  ›  技术社区  ›  Greg Finzer

如何绕过.NETFramework 4.0中的DnsRecordListFree错误?

  •  1
  • Greg Finzer  · 技术社区  · 16 年前

    我在查MxRecordLookup。在.NET Framework 4.0中调用DnsRecordListFree时出错。我使用的是Windows7。我该如何绕过它?错误如下:

        [DllImport("dnsapi", EntryPoint = "DnsQuery_W", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
        private static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)]ref string pszName, QueryTypes wType, QueryOptions options, int aipServers, ref IntPtr ppQueryResults, int pReserved);
    
        [DllImport("dnsapi", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);
    
        public List<string> GetMXRecords(string domain)
        {
            List<string> records = new List<string>();
            IntPtr ptr1 = IntPtr.Zero;
            IntPtr ptr2 = IntPtr.Zero;
            MXRecord recMx;
    
            try
            {
    
                int result = DnsQuery(ref domain, QueryTypes.DNS_TYPE_MX, QueryOptions.DNS_QUERY_BYPASS_CACHE, 0, ref ptr1, 0);
                if (result != 0)
                {
                    if (result == 9003)
                    {
                        //No Record Exists
                    }
                    else
                    {
                        //Some other error
                    }
                }
    
                for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = recMx.pNext)
                {
                    recMx = (MXRecord)Marshal.PtrToStructure(ptr2, typeof(MXRecord));
                    if (recMx.wType == 15)
                    {
                        records.Add(Marshal.PtrToStringAuto(recMx.pNameExchange));
                    }
                }
            }
            finally
            {
                DnsRecordListFree(ptr1, 0);
            }
    
            return records;
        }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Julien Lebosquain    16 年前

    阅读 Security Changes in the .NET Framework 4 了解什么是透明和关键的代码。默认情况下,在.NET4中,程序集中用 AllowPartiallyTrustedCallersAttribute SecurityCriticalAttribute ). 仅安全关键(标有 SecuritySafeCriticalAttribute

    简而言之:


    Security Safe Critical可以称为Security Safe Critical或Critical

    启用设置了Microsoft安全规则的代码分析,以查看有关错误安全调用的警告。请注意,您可以通过应用 [assembly: SecurityRules(SecurityRuleSet.Level1)] 或移除 . 看到了吗 Security-Transparent Code, Level 2 更多信息。

    GetMXRecords 应该变成 SecuritySafeCritical 并且DLL导入调用必须标记为 SecurityCritical

    推荐文章