Is there a way to flush the DNS cache from a C# WPF app? The application would be running on either XP, Vista, or Windows 7.
Asked
Active
Viewed 1.5k times
11
-
1http://brannickdevice.blogspot.com/2006/04/winxp-flushing-dns-programatically.html – Aaron D Aug 17 '10 at 00:09
-
@Aaron: Shame you didn't post as an answer. I would vote for that. – kbrimington Aug 17 '10 at 03:49
-
@kbrimington, I didn't feel right posting an answer for the first result I found in google (smile): http://tinyurl.com/2bx8ngu – Aaron D Aug 17 '10 at 16:17
-
@Aaron: Fair enough. Good on you. – kbrimington Aug 17 '10 at 16:51
-
3 years later and this is the first result. That post is the 7th ;). – claudekennilol Oct 28 '13 at 20:09
-
5 years later, you have to look in the internet archive: https://web.archive.org/web/20090409081630/http://brannickdevice.blogspot.com/2006/04/winxp-flushing-dns-programatically.html ;) – Olivier de Rivoyre Feb 04 '15 at 01:48
5 Answers
30
You can use a function from Microsoft's "dnsapi.dll". This will allow you to do this completely programmatically:
using System.Runtime.InteropServices;
[DllImport("dnsapi.dll",EntryPoint="DnsFlushResolverCache")]
private static extern UInt32 DnsFlushResolverCache ();
public static void FlushMyCache() //This can be named whatever name you want and is the function you will call
{
UInt32 result = DnsFlushResolverCache();
}
I have tested this and it works great.

Mike Webb
- 8,855
- 18
- 78
- 111
-
I run the code & it's working, but how do I know the process has been successfully clear the DNS cache or not? – mutanic Apr 29 '13 at 06:22
-
`DnsFlushResolverCache()` is an undocumented function, which means that its future is not guaranteed. – kfreezen Aug 03 '18 at 16:07
-
This perhaps used to work, but trying this in Win10 presently produced the Incorrect Function error. It's also no longer listed in the msdn docs and is not part of the PInvoke libraries I see in NuGet. – Charles A. Feb 25 '21 at 17:27
10
This may be the poor-man's solution, but you could use System.Diagnostics.Process
to launch ipconfig /flushdns
.

kbrimington
- 25,142
- 5
- 62
- 74
-
1
-
not a bad fallback - might wait to see if anyone else knows of something buried in the .net framework - you'd think it would be in the DNS class if anywhere, but I don't see anything there – Greg Aug 17 '10 at 00:03
-
As long as portability to other platforms isn't a concern, would go with this. – Mike Caron Aug 17 '10 at 03:43
-
This doesn't feel like the ideal solution, but the dnsapi.dll PInvoke function appears to longer exist. – Charles A. Feb 25 '21 at 17:29
9
I searched on the internet and couldnt find away to flush a single dns entry. Working on something for failing over to backup datacenter this is needed for me. I dissembled the DnsFlushResolverCacheEntry_W and came up with the p/invoke sig below. I use the DnsQuery method with the QueryNoWireFlag and NoHostFile flag. If there are any results then I call DnsFlushResolverCacheEntry_W. This might be good info for someone in the future looking to do the same
/// <summary>
/// Removes all related DNS records for the given hostname from the DNS resolver cache.
/// </summary>
/// <param name="hostName">The host name to flush from the resolver cache.</param>
/// <returns>Returns 1 if successful, zero if failed. No other error information is returned.</returns>
/// <remarks>
/// DnsFlushResolverCacheEntry_W is an undocumented method. From dissembler this method has two possible
/// return values 0 or 1. If the argument is null or the _R_ResolverFlushCacheEntry returns something
/// other than zero than the return value is zero. When _R_ResolverFlushCacheEntry returns zero the
/// return value is 1. Based off this and testing of the method it is assumed that 1 is used to indicate success.
/// After calling this method querying the DNS resolver cache returns no results.
///
/// __stdcall DnsFlushResolverCacheEntry_W(x)
/// ....
/// 6DC12729 xor esi, esi // Zero esi
/// 6DC1272B cmp [ebp+arg_0], esi // check if the hostname is null
/// 6DC1272E jz loc_6DC1D8B8 // Jump to end, return value is 0.
/// 6DC12734 mov [ebp+ms_exc.registration.TryLevel], esi
/// 6DC12737 push esi // Push 3 args for method, 2nd is hostname, others null
/// 6DC12738 push [ebp+arg_0]
/// 6DC1273B push esi
/// 6DC1273C call _R_ResolverFlushCacheEntry@12 // call this method
/// 6DC12741 mov [ebp+var_1C], eax // store return value in local
/// 6DC12744 mov [ebp+ms_exc.registration.TryLevel], 0FFFFFFFEh
/// 6DC1274B
/// 6DC1274B loc_6DC1274B:
/// 6DC1274B cmp [ebp+var_1C], esi
/// 6DC1274E jnz loc_6DC1D8E7 // Error? jump to block that does etw then return 0
/// 6DC12754 xor eax, eax // Success? Set eax to zero
/// 6DC12756 inc eax // result is 0, increment by 1. success return value is 1
/// 6DC12757 call __SEH_epilog4
/// 6DC1275C retn 4
///
/// 6DC1D8B8 xor eax, eax // set return value to zero
/// 6DC1D8BA jmp loc_6DC12757 // jump to end
///
/// 6DC1D8E7 mov eax, _WPP_GLOBAL_Control
/// 6DC1D8EC cmp eax, offset _WPP_GLOBAL_Control
/// 6DC1D8F1 jz short loc_6DC1D8B8
/// 6DC1D8F3 test byte ptr [eax+1Ch], 40h
/// 6DC1D8F7 jz short loc_6DC1D8B8 // This is probably testing some flag that is used to indicate if ETW is enabled
/// 6DC1D8F9 push [ebp+var_1C]
/// 6DC1D8FC push offset dword_6DC22494
/// 6DC1D901 push 0Dh
/// 6DC1D903 push dword ptr [eax+14h]
/// 6DC1D906 push dword ptr [eax+10h]
/// 6DC1D909 call _WPP_SF_q@20 ; WPP_SF_q(x,x,x,x,x) // This method does some ETW tracing
/// 6DC1D90E jmp short loc_6DC1D8B8
/// </remarks>
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCacheEntry_W", CharSet = CharSet.Unicode)]
public static extern int DnsFlushResolverCacheEntry(string hostName);

user1985513
- 481
- 1
- 4
- 13
4
Try this -
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C ipconfig /flushdns";
process.StartInfo = startInfo;
process.Start();

akjoshi
- 15,374
- 13
- 103
- 121

Michel Nassour
- 41
- 1
-
It seems a bit hacky to be doing this by running a terminal process. I expect the original poster would prefer another way. – hcarver Nov 16 '12 at 08:29
-
5
1
Try this :
static void flushDNS()
{
string flushDnsCmd = @"/C ipconfig /flushdns";
try
{
var process = new Process
{
StartInfo = new ProcessStartInfo("cmd.exe", flushDnsCmd)
};
process.Start();
process.WaitForExit();
Console.WriteLine(String.Format("Successfully Flushed DNS:'{0}'", flushDnsCmd), EventLogEntryType.Information);
}
catch (Exception exp)
{
Console.WriteLine(String.Format("Failed to Flush DNS:'{0}' . Error:{1}", flushDnsCmd, exp.Message), EventLogEntryType.Error);
}
}

Vikalp Veer
- 417
- 3
- 7