Best Vstest code snippet using Microsoft.TestPlatform.AttachVS.DebuggerUtility.CreateBindCtx
AttachVs.cs
Source:AttachVs.cs
...82 IRunningObjectTable? runninObjectTable = null;83 IEnumMoniker? enumMoniker = null;84 try85 {86 var r = CreateBindCtx(0, out bindCtx);87 Marshal.ThrowExceptionForHR(r);88 if (bindCtx == null)89 {90 Trace($"BindCtx is null. Cannot attach VS.");91 return false;92 }93 bindCtx.GetRunningObjectTable(out runninObjectTable);94 if (runninObjectTable == null)95 {96 Trace($"RunningObjectTable is null. Cannot attach VS.");97 return false;98 }99 runninObjectTable.EnumRunning(out enumMoniker);100 if (enumMoniker == null)101 {102 Trace($"EnumMoniker is null. Cannot attach VS.");103 return false;104 }105 var dteSuffix = ":" + vs.Id;106 var moniker = new IMoniker[1];107 while (enumMoniker.Next(1, moniker, IntPtr.Zero) == 0 && moniker[0] != null)108 {109 moniker[0].GetDisplayName(bindCtx, null, out string dn);110 if (dn.StartsWith("!VisualStudio.DTE.") && dn.EndsWith(dteSuffix))111 {112 object dbg, lps;113 runninObjectTable.GetObject(moniker[0], out object dte);114 // The COM object can be busy, we retry few times, hoping that it won't be busy next time.115 for (var i = 0; i < 10; i++)116 {117 try118 {119 dbg = dte.GetType().InvokeMember("Debugger", BindingFlags.GetProperty, null, dte, null, CultureInfo.InvariantCulture)!;120 lps = dbg.GetType().InvokeMember("LocalProcesses", BindingFlags.GetProperty, null, dbg, null, CultureInfo.InvariantCulture)!;121 var lpn = (System.Collections.IEnumerator)lps.GetType().InvokeMember("GetEnumerator", BindingFlags.InvokeMethod, null, lps, null, CultureInfo.InvariantCulture)!;122 while (lpn.MoveNext())123 {124 var pn = Convert.ToInt32(lpn.Current.GetType().InvokeMember("ProcessID", BindingFlags.GetProperty, null, lpn.Current, null, CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);125 if (pn == pid)126 {127 lpn.Current.GetType().InvokeMember("Attach", BindingFlags.InvokeMethod, null, lpn.Current, null, CultureInfo.InvariantCulture);128 return true;129 }130 }131 }132 // Catch the exception if it is COMException coming directly, or coming from methodInvocation, otherwise just let it be.133 catch (Exception ex) when (ex is COMException || (ex is TargetInvocationException tie && tie.InnerException is COMException))134 {135 Trace($"ComException: Retrying in 250ms.\n{ex}");136 Thread.Sleep(250);137 }138 }139 Marshal.ReleaseComObject(moniker[0]);140 break;141 }142 Marshal.ReleaseComObject(moniker[0]);143 }144 return false;145 }146 finally147 {148 if (enumMoniker != null)149 {150 try151 {152 Marshal.ReleaseComObject(enumMoniker);153 }154 catch { }155 }156 if (runninObjectTable != null)157 {158 try159 {160 Marshal.ReleaseComObject(runninObjectTable);161 }162 catch { }163 }164 if (bindCtx != null)165 {166 try167 {168 Marshal.ReleaseComObject(bindCtx);169 }170 catch { }171 }172 }173 }174 private static Process? GetVsFromPid(Process process)175 {176 var parent = process;177 while (!IsVsOrNull(parent))178 {179 parent = GetParentProcess(parent);180 }181 return parent;182 }183 private static bool IsVsOrNull([NotNullWhen(false)] Process? process)184 {185 if (process == null)186 {187 Trace("Parent process is null..");188 return true;189 }190 var isVs = process.ProcessName.Equals("devenv", StringComparison.InvariantCultureIgnoreCase);191 if (isVs)192 {193 Trace($"Process {process.ProcessName} ({process.Id}) is VS.");194 }195 else196 {197 Trace($"Process {process.ProcessName} ({process.Id}) is not VS.");198 }199 return isVs;200 }201 private static bool IsCorrectParent(Process currentProcess, Process parent)202 {203 try204 {205 // Parent needs to start before the child, otherwise it might be a different process206 // that is just reusing the same PID.207 if (parent.StartTime <= currentProcess.StartTime)208 {209 return true;210 }211 Trace($"Process {parent.ProcessName} ({parent.Id}) is not a valid parent because it started after the current process.");212 }213 catch214 {215 // Access denied or process exited while we were holding the Process object.216 }217 return false;218 }219 private static Process? GetParentProcess(Process process)220 {221 int id = GetParentProcessId(process);222 if (id != -1)223 {224 try225 {226 var parent = Process.GetProcessById(id);227 if (IsCorrectParent(process, parent))228 return parent;229 }230 catch231 {232 // throws when parent no longer runs233 }234 }235 return null;236 static int GetParentProcessId(Process process)237 {238 try239 {240 var handle = process.Handle;241 var res = NtQueryInformationProcess(handle, 0, out var pbi, Marshal.SizeOf<PROCESS_BASIC_INFORMATION>(), out int size);242 var p = res != 0 ? -1 : pbi.InheritedFromUniqueProcessId.ToInt32();243 return p;244 }245 catch246 {247 return -1;248 }249 }250 }251 private static void Trace(string message, [CallerMemberName] string? methodName = null)252 {253 System.Diagnostics.Trace.WriteLine($"[AttachVS]{methodName}: {message}");254 }255 [StructLayout(LayoutKind.Sequential)]256 private struct PROCESS_BASIC_INFORMATION257 {258 public readonly IntPtr ExitStatus;259 public readonly IntPtr PebBaseAddress;260 public readonly IntPtr AffinityMask;261 public readonly IntPtr BasePriority;262 public readonly IntPtr UniqueProcessId;263 public IntPtr InheritedFromUniqueProcessId;264 }265 [DllImport("ntdll.dll", SetLastError = true)]266 private static extern int NtQueryInformationProcess(267 IntPtr processHandle,268 int processInformationClass,269 out PROCESS_BASIC_INFORMATION processInformation,270 int processInformationLength,271 out int returnLength);272 [DllImport("Kernel32")]273 private static extern uint GetTickCount();274 [DllImport("ole32.dll")]275 private static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc);276}...
CreateBindCtx
Using AI Code Generation
1using Microsoft.TestPlatform.AttachVS;2using System;3using System.Runtime.InteropServices.ComTypes;4{5 {6 static void Main(string[] args)7 {8 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();9 Console.WriteLine("BindCtx created successfully");10 }11 }12}
CreateBindCtx
Using AI Code Generation
1using System;2using System.Runtime.InteropServices;3using Microsoft.TestPlatform.AttachVS;4using System.Runtime.InteropServices.ComTypes;5{6 {7 static void Main(string[] args)8 {9 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();10 Console.WriteLine(bindCtx);11 Console.Read();12 }13 }14}
CreateBindCtx
Using AI Code Generation
1usingMicrosoft.TestPlatform.AtacVS;2using System;3using System.Runtime.InteropServices;4using System.Runtime.InteropServices.ComTypes;5{6 {7 static void Main(string[] args)8 {9 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();10 Console.WriteLine(indCtx);11 }12 }13}14usingMirosoft.TestPlatform.AttachVS;15using System;16using System.Runtime.InteropServices;17using System.Runtime.InteropServices.ComTypes;18{19 {20 static void Main(string[] args)21 {22 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();23 Consle.WriteLie(bindCtx);24 }25 }26}27usingMicrosoft.TestPlaform.AttacVS;28using Systm;29usingSystem.Runtime.InteropServices;30using System.Runtime.InteropServices.ComTypes;31{32 {33 static voi Main(string[] args)34 {35 IBindCtx bindCtx = DUtilityCreateBindCtx();36 Console.WriteLine(bindCtx);37 }using System;38 }39}40using Microsoft.TestPlatform.AttachVS;41using System;42using System.Runtime.InteropServices;43using System.Runtime.InteropServices.ComTypes;44{45 {46 static void Main(string[] args)47 {48 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();49 Console.WriteLine(bindCtx);50 }51 }52}53using Microsoft.TestPlatform.AttachVS;54using System;55using System.Runtime.InteropServices;56using System.Runtime.InteropServices.ComTypes;57{58 {59 static void Main(string[] args)60 {61 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();62 Console.WriteLine(bindCtx);63 }64 }65}66using Microsoft.TestPlatform.AttachVS;67using System;68using System.Runtime.InteropServices.Runtime.InteropServices;69using System.Runtime.InteropServices.ComTypes;70{71 {72 static void Main(string[] args)73 {
CreateBindCtx
Using AI Code Generation
1using System;2using Microsoft.TestPlatform.AttachVS;3using System.Runtime.InteropServices.ComTypes;4{5 {6 static void Main(string[] args)7 {8 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();9 Console.WriteLine(bindCtx);10 Console.Read();11 }12 }13}
CreateBindCtx
Using AI Code Generation
1using System;2using Microsoft.TestPlatform.AttachVS;3using System.Runtime.InteropServices;4{5 {6 static void Main(string[] args)7 {8 {9 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();10 Console.WriteLine("The bind context is created successfully");11 }12 catch (Exception ex)13 {14 Console.WriteLine("The bind context is not created successfully");15 Console.WriteLine(ex.Message);16 }17 }18 }19}20using System;21using Microsoft.TestPlatform.AttachVS;22using System.Runtime.InteropServices;23{24 {25 static void Main(string[] args)26 {27 {28 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();29 Console.WriteLine("The bind context is created successfully");30 }31 catch (Exception ex)32 {33 Console.WriteLine("The bind context is not created successfully");34 Console.WriteLine(ex.Message);35 }36 }37 }38}39using System;40using Microsoft.TestPlatform.AttachVS;41using System.Runtime.InteropServices;
CreateBindCtx
Using AI Code Generation
1sin System;2usin Systm.Runtime.InteopServices;3using SystemRuntime.InteropServices.ComTypes;4using Microsoft.TestPlatform.AttachVS;{5 clMicrosoft.TestPlatform.AttachVa.DebuggerUtilits;6{7 {8 static void Main(string[] args)9 {10 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();11 IMoniker moniker = DebuggerUtility.CreateFileMoniker(bindCtx, "C:\\test.txt");12 }13 }14}
CreateBindCtx
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using System.Runtime.InteropServices;7using Microsoft.TestPlatform.AttachVS;8{9 {10 static void Main(string[] args)11 {12 IBindCtx pbc;13 int hr = DebuggerUtility.CreateBindCtx(0, out pbc);14 if (hr != 0)15 {16 Console.WriteLine("CreateBindCtx failed with hr=0x{0:X}", hr);17 return;18 }19 IRunningObjectTable prot;20 hr = pbc.GetRunningObjectTable(out prot);21 if (hr != 0)22 {23 Console.WriteLine("GetRunningObjectTable failed with hr=0x{0:X}", hr);24 return;25 }26 IEnumMoniker pmon;27 hr = prot.EnumRunning(out pmon);28 if (hr != 0)29 {30 Console.WriteLine("EnumRunning failed with hr=0x{0:X}", hr);31 return;32 }33 IMoniker[] rgelt = new IMoniker[1];34 IntPtr pceltFetched = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));35 while (true)36 {37 hr = pmon.Next(1, rgelt, pceltFetched);38 if (hr != 0)39 {40 Console.WriteLine("EnumRunning.Next failed with hr=0x{0:X}", hr);41 return;42 }43 if (Marshal.ReadInt32(pceltFetched) == 0)44 break;45 Console.WriteLine(rgelt[0].ToString());46 }47 }48 }49}50 {51 static void Main(string[] args)52 {53 {54 IBindCtx bindCtx = DebuggerUtility.CreateBindCtx();55 Console.WriteLine("The bind context is created successfully");56 }57 catch (Exception ex)58 {59 Console.WriteLine("The bind context is not created successfully");60 Console.WriteLine(ex.Message);61 }62 }63 }64}
CreateBindCtx
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using System.Runtime.InteropServices;7using Microsoft.TestPlatform.AttachVS;8{9 {10 static void Main(string[] args)11 {12 IBindCtx pbc;13 int hr = DebuggerUtility.CreateBindCtx(0, out pbc);14 if (hr != 0)15 {16 Console.WriteLine("CreateBindCtx failed with hr=0x{0:X}", hr);17 return;18 }19 IRunningObjectTable prot;20 hr = pbc.GetRunningObjectTable(out prot);21 if (hr != 0)22 {23 Console.WriteLine("GetRunningObjectTable failed with hr=0x{0:X}", hr);24 return;25 }26 IEnumMoniker pmon;27 hr = prot.EnumRunning(out pmon);28 if (hr != 0)29 {30 Console.WriteLine("EnumRunning failed with hr=0x{0:X}", hr);31 return;32 }33 IMoniker[] rgelt = new IMoniker[1];34 IntPtr pceltFetched = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));35 while (true)36 {37 hr = pmon.Next(1, rgelt, pceltFetched);38 if (hr != 0)39 {40 Console.WriteLine("EnumRunning.Next failed with hr=0x{0:X}", hr);41 return;42 }43 if (Marshal.ReadInt32(pceltFetched) == 0)44 break;45 Console.WriteLine(rgelt[0].ToString());46 }47 }48 }49}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!