1

Я пытаюсь написать пакет Visual Studio, который будет прикреплять отладчик к именованному процессу.Присоединение к процессу в пакете Visual Studio

Я использую следующий код в своем пакете.

var info = new VsDebugTargetInfo 
{ 
       dlo = DEBUG_LAUNCH_OPERATION.DLO_AlreadyRunning, 
       bstrExe = strProcessName, 
       bstrCurDir = "c:\\", 
       bstrArg = "", 
       bstrEnv = "", 
       bstrOptions = null, 
       bstrPortName = null, 
       bstrMdmRegisteredName = null, 
       bstrRemoteMachine = "", 
       cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf<VsDebugTargetInfo>(), 
       grfLaunch = (uint)(__VSDBGLAUNCHFLAGS.DBGLAUNCH_DetachOnStop| __VSDBGLAUNCHFLAGS.DBGLAUNCH_StopDebuggingOnEnd| __VSDBGLAUNCHFLAGS.DBGLAUNCH_WaitForAttachComplete), 
       fSendStdoutToOutputWindow = 1, 
       clsidCustom = VSConstants.CLSID_ComPlusOnlyDebugEngine 
}; 
VsShellUtilities.LaunchDebugger(ServiceProvider, info); 

Однако я получаю, бесполезную, ошибка:

Exception : Unable to attach. Operation not supported. Unknown error: 0x80070057. 

код, очевидно, что-то делать, потому что, если процесс еще не начался, я получаю эту ошибку

Exception : Unable to attach. Process 'xxxxxxxx' is not running on 'xxxxxxxx'. 

Процесс это управляемый процесс .net 4, и я могу подключиться к нему через VS UI.

Для контекста Я пытаюсь заменить простой макрос, который я использовал в VS 2010, чтобы выполнить ту же работу, но это явно не может быть запущено в более новых версиях Visual Studio.

+0

Чтобы продолжить использовать свой макрос в новом VS, вы можете попробовать Visual Commander https://visualstudiogallery.msdn.microsoft.com/deda8ac1-75e6-4068-89ab-b607cee38f2d –

+0

Спасибо, после небольшого изменения настроек Visual Commander для запуска моего оригинального макроса, однако мне все еще интересно узнать, как исправить исходную проблему, поскольку я хотел бы построить собственное расширение. –

ответ

1

я нашел совершенно другой кусок кода, inspited по https://github.com/whut/AttachTo, работал гораздо лучше, чтобы достичь того же результата

foreach (Process process in (DTE)GetService(typeof(DTE)).Debugger.LocalProcesses) 
    if (process.Name.EndsWith(strProcessName,StringComparison.InvariantCultureIgnoreCase)) 
     process.Attach(); 

я должен был использовать «заканчивается», потому что имена процесса включают полный путь к работает exe.