我不熟悉非托管代码,但在我的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
请帮忙!
答案 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);
希望,这有帮助。