// Attach the debug engine to a program. int IDebugEngine2.Attach(IDebugProgram2[] rgpPrograms, IDebugProgramNode2[] rgpProgramNodes, uint celtPrograms, IDebugEventCallback2 ad7Callback, enum_ATTACH_REASON dwReason) { Debug.Assert(_ad7ProgramId == Guid.Empty); if (celtPrograms != 1) { Debug.Fail("Node debugging only supports one program in a process"); throw new ArgumentException(); } IDebugProgram2 program = rgpPrograms[0]; int processId = EngineUtils.GetProcessId(program); if (processId == 0) { // engine only supports system processes Debug.WriteLine("NodeEngine failed to get process id during attach"); return(VSConstants.E_NOTIMPL); } EngineUtils.RequireOk(program.GetProgramId(out _ad7ProgramId)); // Attach can either be called to attach to a new process, or to complete an attach // to a launched process if (_process == null) { // TODO: Where do we get the language version from? _events = ad7Callback; // Check if we're attaching remotely using the node remote debugging transport if (!NodeProcess.TryAttach(processId, out _process)) { MessageBox.Show("Failed to attach debugger:\n", null, MessageBoxButtons.OK, MessageBoxIcon.Error); return(VSConstants.E_FAIL); } AttachProcessEvents(_process); _attached = true; } else { if (processId != _process.Id) { Debug.Fail("Asked to attach to a process while we are debugging"); return(VSConstants.E_FAIL); } } AD7EngineCreateEvent.Send(this); lock (_syncLock) { _programCreated = true; if (_processLoadedThread != null) { SendLoadComplete(_processLoadedThread); } } Debug.WriteLine("NodeEngine Attach returning S_OK"); return(VSConstants.S_OK); }
public static void Send(AD7Engine engine) { var eventObject = new AD7EngineCreateEvent(engine); engine.Send(eventObject, IID, null, null); }