Exemplo n.º 1
0
        private static IServiceContainer CreateParentContainer( IOleServiceProvider serviceProvider )
        {
            Contract.Requires( serviceProvider != null );
            Contract.Ensures( Contract.Result<IServiceContainer>() != null );

            var parent = new VisualStudioServiceProvider( serviceProvider );
            parent.AddService( typeof( IComponentModel ), ( c, t ) => c.GetService( typeof( SComponentModel ) ) );
            parent.AddService( typeof( IValidator ), ( c, t ) => new ValidatorAdapter() );
            return parent;
        }
Exemplo n.º 2
0
        private string GetDefaultExtension()
        {
            Contract.Ensures( Contract.Result<string>() != null );

            if ( site == null )
                return string.Empty;

            using ( var serviceProvider = new VisualStudioServiceProvider( (IOleServiceProvider) site ) )
            {
                IVSMDCodeDomProvider provider;
                CodeDomProvider codeProvider;

                if ( serviceProvider.TryGetService( out provider ) && ( codeProvider = provider.CodeDomProvider as CodeDomProvider ) != null )
                    return ".g." + codeProvider.FileExtension;
            }

            return string.Empty;
        }
        /// <inheritdoc />
        public Process LaunchProcess(ProcessStartInfo processStartInfo)
        {
            if (processStartInfo == null)
                throw new ArgumentNullException("processStartInfo");

            Process foundProcess = null;
            try
            {
                IVisualStudio visualStudio = GetVisualStudio(true, logger);
                if (visualStudio != null)
                {
                    visualStudio.Call(dte =>
                    {
                        List<int> currentDebuggedProcesses = new List<int>();
                        if (dte.Debugger.DebuggedProcesses != null)
                        {
                            foreach (EnvDTE.Process dteProcess in dte.Debugger.DebuggedProcesses)
                                currentDebuggedProcesses.Add(dteProcess.ProcessID);
                        }

                        var serviceProvider = new VisualStudioServiceProvider(dte);
                        var debugger = serviceProvider.GetService<SVsShellDebugger, IVsDebugger2>();
                        var engineGuids = GetEngineGuids();

                        int debugTargetInfoSize = Marshal.SizeOf(typeof(VsDebugTargetInfo2));
                        int guidSize = Marshal.SizeOf(typeof(Guid));

                        IntPtr debugTargetInfoPtr = Marshal.AllocCoTaskMem(debugTargetInfoSize + guidSize * engineGuids.Count);
                        try
                        {
                            IntPtr engineGuidsPtr = new IntPtr(debugTargetInfoPtr.ToInt64() + debugTargetInfoSize);

                            var environment = new StringBuilder();
                            foreach (DictionaryEntry variable in processStartInfo.EnvironmentVariables)
                                environment.Append(variable.Key).Append('=').Append(variable.Value).Append('\0');

                            var debugTargetInfo = new VsDebugTargetInfo2()
                            {
                                cbSize = (uint) debugTargetInfoSize,
                                bstrExe = Path.GetFullPath(processStartInfo.FileName),
                                bstrArg = processStartInfo.Arguments,
                                bstrCurDir = string.IsNullOrEmpty(processStartInfo.WorkingDirectory) ? Environment.CurrentDirectory : Path.GetFullPath(processStartInfo.WorkingDirectory),
                                bstrEnv = environment.Length != 0 ? environment.ToString() : null,
                                dwDebugEngineCount = (uint) engineGuids.Count,
                                pDebugEngines = engineGuidsPtr,
                                fSendToOutputWindow = 1,
                                guidLaunchDebugEngine = VisualStudioDebugEngines.ManagedAndNative,
                                dlo = (int) DEBUG_LAUNCH_OPERATION.DLO_CreateProcess,
                                LaunchFlags = (int)(__VSDBGLAUNCHFLAGS.DBGLAUNCH_WaitForAttachComplete | __VSDBGLAUNCHFLAGS.DBGLAUNCH_Silent)
                            };

                            Marshal.StructureToPtr(debugTargetInfo, debugTargetInfoPtr, false);

                            for (int i = 0; i < engineGuids.Count; i++)
                                Marshal.StructureToPtr(engineGuids[i], new IntPtr(engineGuidsPtr.ToInt64() + i * guidSize), false);

                            int hresult = debugger.LaunchDebugTargets2(1, debugTargetInfoPtr);
                            if (hresult != S_OK)
                                Marshal.ThrowExceptionForHR(hresult);
                        }
                        finally
                        {
                            Marshal.FreeCoTaskMem(debugTargetInfoPtr);
                        }

                        if (dte.Debugger.DebuggedProcesses != null)
                        {
                            foreach (EnvDTE.Process dteProcess in dte.Debugger.DebuggedProcesses)
                            {
                                if (!currentDebuggedProcesses.Contains(dteProcess.ProcessID))
                                {
                                    foundProcess = Process.GetProcessById(dteProcess.ProcessID);
                                    break;
                                }
                            }
                        }

                        if (foundProcess == null)
                        {
                            logger.Log(LogSeverity.Debug, "Could not find the newly launched process.");
                        }
                    });
                }
            }
            catch (VisualStudioException ex)
            {
                logger.Log(LogSeverity.Debug, "Failed to attach Visual Studio debugger to process.", ex);
            }

            return foundProcess;
        }