public override IEnumerable <AttachProgramOptions> Create(AttachProgramOptionsProviderContext context) { foreach (var process in DebuggableProcesses.GetProcesses(context.ProcessIds, context.IsValidProcess, context.CancellationToken)) { ProcessModule[] modules; try { modules = process.Modules.Cast <ProcessModule>().ToArray(); } catch { continue; } var coreclrFilename = FileUtilities.GetNativeDllFilename("coreclr"); foreach (var module in modules) { var moduleFilename = module.FileName; var dllName = Path.GetFileName(moduleFilename); if (dllName.Equals(coreclrFilename, StringComparison.OrdinalIgnoreCase)) { foreach (var info in TryGetCoreCLRInfos(process, moduleFilename)) { context.CancellationToken.ThrowIfCancellationRequested(); yield return(info); } break; } } } }
public override IEnumerable <AttachProgramOptions> Create(AttachProgramOptionsProviderContext context) { var clsid = new Guid("9280188D-0E8E-4867-B30C-7FA83884E8DE"); var riid = typeof(DEMH.ICLRMetaHost).GUID; var mh = (DEMH.ICLRMetaHost)NativeMethods.CLRCreateInstance(ref clsid, ref riid); foreach (var process in DebuggableProcesses.GetProcesses(context.ProcessIds, context.IsValidProcess, context.CancellationToken)) { int hr = mh.EnumerateLoadedRuntimes(process.Handle, out var iter); if (hr >= 0) { for (;;) { context.CancellationToken.ThrowIfCancellationRequested(); hr = iter.Next(1, out object obj, out uint fetched); if (hr < 0 || fetched == 0) { break; } var rtInfo = (DEMH.ICLRRuntimeInfo)obj; uint chBuffer = 0; var sb = new StringBuilder(300); hr = rtInfo.GetVersionString(sb, ref chBuffer); sb.EnsureCapacity((int)chBuffer); hr = rtInfo.GetVersionString(sb, ref chBuffer); yield return(new DotNetFrameworkAttachProgramOptions(process.Id, sb.ToString())); } } } }
public override IEnumerable <AttachProgramOptions> Create(AttachProgramOptionsProviderContext context) { foreach (var process in DebuggableProcesses.GetProcesses(context.ProcessIds, context.IsValidProcess, context.CancellationToken)) { foreach (var info in TryGetCoreCLRInfos(process)) { context.CancellationToken.ThrowIfCancellationRequested(); yield return(info); } } }