我如何P /调用dnsapi.dll方法:DnsValidateServerStatus

时间:2011-11-30 17:50:13

标签: c# pinvoke

我不熟悉非托管代码,但在我的C#应用​​程序中使用了dnsapi.dll中的一些方法。有很多关于如何使用DnsQuery或DnsFlushResolverCache的例子,但DnsValidateServerStatus方法似乎是新的(需要Win 7或Server 2008 R2)。我想在我的C#应用​​程序中使用这个方法,但我似乎无法使Marshaling和结构正常工作。可以在以下位置找到此方法的文档: http://msdn.microsoft.com/en-us/library/windows/desktop/ee837436(v=VS.85).aspx

请帮忙!

2 个答案:

答案 0 :(得分:0)

不确定是否有效:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
public struct sockaddr {

    /// u_short->unsigned short
    public ushort sa_family;

    /// char[14]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=14)]
    public byte[] sa_data;
}



    /// Return Type: DWORD->unsigned int
    ///server: PSOCKADDR->sockaddr*
    ///queryName: PCWSTR->WCHAR*
    ///serverStatus: PDWORD->DWORD*
    [System.Runtime.InteropServices.DllImportAttribute("dnsapi.dll", EntryPoint="DnsValidateServerStatus")]
public static extern  uint DnsValidateServerStatus([System.Runtime.InteropServices.InAttribute()] ref sockaddr server, [System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string queryName, [System.Runtime.InteropServices.OutAttribute()] out uint serverStatus) ;
}

答案 1 :(得分:0)

此Win32 API的难点部分是SOCKADDR结构。在PINVOKE.NET上有SOCKADDR结构的实现。以下示例基于此实现:

[DllImport("Dnsapi.dll")]
private static extern int  DnsValidateServerStatus(IntPtr sockaddr, string queryName, ref uint serverStatus);

WinsockSockAddr addr = new WinsockSockAddr(IPAddress.Parse("127.0.0.1"), 0);
uint serverStatus = 0;
int status = DnsValidateServerStatus(addr.PinnedSockAddr, "fqdn server name", ref serverStatus);

Console.Out.WriteLine(status);
Console.Out.WriteLine(serverStatus);

希望,这有帮助。