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; }
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; }