2010-05-25 4 views
1

MxRecordLookup을하고 있습니다. .NET Framework 4.0에서 DnsRecordListFree를 호출 할 때 오류가 발생합니다. Windows 7을 사용하고 있습니다. 어떻게 해결할 수 있습니까? 다음은 오류입니다..NET Framework 4.0에서 DnsRecordListFree 오류를 해결하는 방법은 무엇입니까?

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

읽기 Security Changes in the .NET Framework 4이 투명하고 중요한 코드가 무엇인지 이해하기 :

여기 내 코드입니다. 기본적으로 .NET 4에서 AllowPartiallyTrustedCallersAttribute으로 표시된 어셈블리의 코드는 투명하므로 중요한 코드 (SecurityCriticalAttribute으로 표시된 코드)를 호출 할 수 없습니다. 중요 보안 코드 (SecuritySafeCriticalAttribute) 또는 중요한 코드 만 중요한 코드를 호출 할 수 있습니다. 그리고 투명 보안 호출로 호출 할 수있는 중요한 보안 안전. 한마디로

:


보안 안전 치명타 중요하거나 중요한이
긴급 긴급

설정 Microsoft 보안 규칙 코드 분석을 사용 호출 할 수 있습니다 보안 안전 호출 할 수있는 중요한 투명 또는 보안 안전을 호출 할 수 있습니다 투명 나쁜 보안 호출에 대한 경고를 볼 수 있습니다. [assembly: SecurityRules(SecurityRuleSet.Level1)]을 적용하거나 AllowPartiallyTrustedCallersAttribute을 제거하면 .NET Framework 2.0에서 보안이 작동하는 방식 (모든 코드가 중요 함)으로 돌아갈 수 있습니다. 자세한 내용은 Security-Transparent Code, Level 2을 참조하십시오.

새 규칙을 따르려면 SecuritySafeCritical이되어야하고 DLL 가져 오기 호출은 SecurityCritical으로 표시되어야합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 따라서 메서드 이름이나 어셈블리 구성을 SecuritySafeCritical로 표시해야합니까? –

관련 문제