Как обойти ошибку DnsRecordListFree в .NET Framework 4.0? - PullRequest
1 голос
/ 25 мая 2010

Я делаю MxRecordLookup. Я получаю сообщение об ошибке при вызове DnsRecordListFree в .NET Framework 4.0. Я использую Windows 7. Как мне обойти это? Вот ошибка:

System.MethodAccessException: попытка прозрачным методом безопасности вызвать собственный код через метод.

Вот мой код:

    [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 Ответ

1 голос
/ 25 мая 2010

Чтение Безопасность Изменения в .NET Framework 4 , чтобы понять, что такое прозрачный и критический код. По умолчанию в .NET 4 любой код в сборке, помеченный AllowPartiallyTrustedCallersAttribute, является прозрачным, что означает, что он не может вызвать критический код (код, помеченный SecurityCriticalAttribute). Только критически безопасный код безопасности (отмеченный SecuritySafeCriticalAttribute) или критический код может вызывать критический код. А безопасное безопасное критическое можно назвать прозрачным вызванным.

Короче говоря:

Прозрачный может вызвать Прозрачный или Безопасный Критический
Безопасность Safe Critical может вызвать Безопасность Safe Critical или Critical
Критическим можно назвать Критическим

Включить анализ кода с установленными правилами безопасности Microsoft, чтобы видеть предупреждения о неправильных вызовах безопасности. Обратите внимание, что вы можете вернуться к тому, как работала система безопасности в .NET Framework 2.0 (весь код важен), применив [assembly: SecurityRules(SecurityRuleSet.Level1)] или удалив AllowPartiallyTrustedCallersAttribute. См. Прозрачный код безопасности, уровень 2 для получения дополнительной информации.

Чтобы соответствовать новым правилам, GetMXRecords должно стать SecuritySafeCritical, а вызовы импорта DLL должны быть отмечены SecurityCritical.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...