/// <summary> /// Launches the Visual Studio debugger. /// </summary> protected async Task <IReadOnlyList <VsDebugTargetProcessInfo> > DoLaunchAsync(params IDebugLaunchSettings[] launchSettings) { VsDebugTargetInfo4[] launchSettingsNative = launchSettings.Select(GetDebuggerStruct4).ToArray(); if (launchSettingsNative.Length == 0) { return(Array.Empty <VsDebugTargetProcessInfo>()); } try { // The debugger needs to be called on the UI thread await ThreadingService.SwitchToUIThread(); IVsDebugger4 shellDebugger = await _vsDebuggerService.GetValueAsync(); var launchResults = new VsDebugTargetProcessInfo[launchSettingsNative.Length]; shellDebugger.LaunchDebugTargets4((uint)launchSettingsNative.Length, launchSettingsNative, launchResults); return(launchResults); } finally { // Free up the memory allocated to the (mostly) managed debugger structure. foreach (VsDebugTargetInfo4 nativeStruct in launchSettingsNative) { FreeVsDebugTargetInfoStruct(nativeStruct); } } }
/// <summary> /// Launches the Visual Studio debugger. /// </summary> protected async Task DoLaunchAsync(IVsDebuggerLaunchCompletionCallback cb, params IDebugLaunchSettings[] launchSettings) { if (launchSettings.Length == 0) { cb.OnComplete(0, 0, null); return; } VsDebugTargetInfo4[] launchSettingsNative = launchSettings.Select(GetDebuggerStruct4).ToArray(); try { // The debugger needs to be called on the UI thread await ThreadingService.SwitchToUIThread(); IVsDebuggerLaunchAsync shellDebugger = await _vsDebuggerService.GetValueAsync(); shellDebugger.LaunchDebugTargetsAsync((uint)launchSettingsNative.Length, launchSettingsNative, cb); } finally { // Free up the memory allocated to the (mostly) managed debugger structure. foreach (VsDebugTargetInfo4 nativeStruct in launchSettingsNative) { FreeVsDebugTargetInfoStruct(nativeStruct); } } }
private async Task ProjectUpdateAsync(IProjectVersionedValue <IProjectSnapshot> update) { // Switch to the Main thread (if necessary): await ThreadingService.SwitchToUIThread(); OnProjectChanged(new ProjectChangedEventArgs(update.Value.ProjectInstance)); }
/// <summary> /// Handles the <see cref="IActiveConfiguredProjectSubscriptionService"/> callback on the active configured project's /// design-time build change notification service. /// </summary> private async Task ProjectBuildRuleBlock_ChangedAsync(IProjectVersionedValue <IProjectSubscriptionUpdate> e) { await ThreadingService.SwitchToUIThread(); using (ProjectAsynchronousTasksService.LoadedProject()) { foreach (var resolvedReferenceChange in e.Value.ProjectChanges.Values) { if (!WatchedDesignTimeBuildRules.Contains(resolvedReferenceChange.After.RuleName)) { // This is an evaluation rule. continue; } foreach (string resolvedReferencePath in resolvedReferenceChange.Difference.AddedItems) { // If this is a resolved project reference, we need to treat it specially. string originalItemSpec = resolvedReferenceChange.After.Items[resolvedReferencePath]["OriginalItemSpec"]; if (!string.IsNullOrEmpty(originalItemSpec)) { if (e.Value.CurrentState[ProjectReference.SchemaName].Items.ContainsKey(originalItemSpec)) { string originalFullPath = UnconfiguredProject.MakeRooted(originalItemSpec); ProjectReferenceState state; if (!_projectReferenceFullPaths.TryGetValue(originalFullPath, out state)) { _projectReferenceFullPaths = _projectReferenceFullPaths.Add(originalFullPath, state = new ProjectReferenceState()); } state.ResolvedPath = resolvedReferencePath; // Be careful to not add assembly references that overlap with project references. if (state.AsProjectReference) { continue; } } } Marshal.ThrowExceptionForHR(_intellisenseEngine.AddAssemblyReference(resolvedReferencePath)); } foreach (string resolvedReferencePath in resolvedReferenceChange.Difference.RemovedItems) { Marshal.ThrowExceptionForHR(_intellisenseEngine.RemoveAssemblyReference(resolvedReferencePath)); } Marshal.ThrowExceptionForHR(_intellisenseEngine.StartIntellisenseEngine()); } } }
/// <summary> /// Handles the <see cref="IActiveConfiguredProjectSubscriptionService"/> callback event on the active configured project's /// change notification service. /// </summary> private async System.Threading.Tasks.Task ProjectRuleBlock_ChangedAsync(IProjectVersionedValue <IProjectSubscriptionUpdate> e) { await ThreadingService.SwitchToUIThread(); await ProjectAsynchronousTasksService.LoadedProjectAsync(async delegate { var sourceFiles = e.Value.ProjectChanges[CSharp.SchemaName]; var projectReferences = e.Value.ProjectChanges[ProjectReference.SchemaName]; #pragma warning disable CA2007 // Do not directly await a Task (see https://github.com/dotnet/roslyn/issues/6770) var treeUpdate = await ProjectTreeService.PublishLatestTreeAsync(blockDuringLoadingTree: true); #pragma warning restore CA2007 // Do not directly await a Task var tree = treeUpdate.Tree; foreach (var sourceUnit in sourceFiles.Difference.AddedItems.Select(item => SourceFileToLanguageServiceUnit(item, tree)).Where(u => u != null)) { Marshal.ThrowExceptionForHR(_intellisenseEngine.AddFile(sourceUnit.Item1, sourceUnit.Item2)); } foreach (var sourceUnit in sourceFiles.Difference.RemovedItems.Select(item => SourceFileToLanguageServiceUnit(item, tree)).Where(u => u != null)) { Marshal.ThrowExceptionForHR(_intellisenseEngine.RemoveFile(sourceUnit.Item1, sourceUnit.Item2)); } foreach (KeyValuePair <string, string> sourceFileNames in sourceFiles.Difference.RenamedItems) { var newSourceUnit = SourceFileToLanguageServiceUnit(sourceFileNames.Value, tree); if (newSourceUnit != null) { string beforeAbsolutePath = UnconfiguredProject.MakeRooted(sourceFileNames.Key); Marshal.ThrowExceptionForHR(_intellisenseEngine.RenameFile(beforeAbsolutePath, newSourceUnit.Item1, newSourceUnit.Item2)); } } foreach (string projectReferencePath in projectReferences.Difference.AddedItems) { string projectReferenceFullPath = UnconfiguredProject.MakeRooted(projectReferencePath); ProjectReferenceState state; if (!_projectReferenceFullPaths.TryGetValue(projectReferenceFullPath, out state)) { _projectReferenceFullPaths = _projectReferenceFullPaths.Add(projectReferenceFullPath, state = new ProjectReferenceState()); } IVsIntellisenseProject intellisenseProject; if (LanguageServiceRegister.TryGetIntellisenseProject(projectReferenceFullPath, out intellisenseProject)) { if (state.ResolvedPath != null && !state.AsProjectReference) { Marshal.ThrowExceptionForHR(_intellisenseEngine.RemoveAssemblyReference(state.ResolvedPath)); } state.AsProjectReference = true; Marshal.ThrowExceptionForHR(_intellisenseEngine.AddP2PReference(intellisenseProject)); } } foreach (string projectReferencePath in projectReferences.Difference.RemovedItems) { string projectReferenceFullPath = UnconfiguredProject.MakeRooted(projectReferencePath); _projectReferenceFullPaths = _projectReferenceFullPaths.Remove(projectReferenceFullPath); IVsIntellisenseProject intellisenseProject; if (LanguageServiceRegister.TryGetIntellisenseProject(projectReferencePath, out intellisenseProject)) { Marshal.ThrowExceptionForHR(_intellisenseEngine.RemoveP2PReference(_intellisenseEngine)); } ProjectReferenceState state; if (_projectReferenceFullPaths.TryGetValue(projectReferenceFullPath, out state)) { state.AsProjectReference = false; } } Marshal.ThrowExceptionForHR(_intellisenseEngine.StartIntellisenseEngine()); }); }