From 0053f45174d041d6ec8c7c3a82a86a3fbca40a8d Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 09:09:04 +0000 Subject: [PATCH 01/10] alias Task --- SharedProject/Core/Model/CoverageProject.cs | 7 ++++--- .../Core/ReportGenerator/ReportGeneratorUtil.cs | 9 +++++---- SharedProject/Impl/Logger.cs | 5 +++-- SharedProject/Output/OutputToolWindowPackage.cs | 5 +++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/SharedProject/Core/Model/CoverageProject.cs b/SharedProject/Core/Model/CoverageProject.cs index 144286fa..2ee58364 100644 --- a/SharedProject/Core/Model/CoverageProject.cs +++ b/SharedProject/Core/Model/CoverageProject.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; +using Task = System.Threading.Tasks.Task; using System.Xml.Linq; using System.Xml.XPath; using EnvDTE; @@ -355,7 +356,7 @@ public XElement ProjectFileXElement public bool Is64Bit { get; set; } public string RunSettingsFile { get; set; } - public async System.Threading.Tasks.Task StepAsync(string stepName, Func action) + public async Task StepAsync(string stepName, Func action) { if (HasFailed) { @@ -380,7 +381,7 @@ public async System.Threading.Tasks.Task StepAsync(string stepName, Func PrepareForCoverageAsync() + public async Task PrepareForCoverageAsync() { EnsureDirectories(); CleanFCCDirectory(); @@ -389,7 +390,7 @@ public async System.Threading.Tasks.Task referencedProjects = await GetReferencedProjectsAsync(); SetExcludedReferencedProjects(referencedProjects); diff --git a/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs b/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs index e53cfc88..75f25472 100644 --- a/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs +++ b/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using Task = System.Threading.Tasks.Task; using System.Windows; using ExCSS; using FineCodeCoverage.Core.Utilities; @@ -25,8 +26,8 @@ interface IReportGeneratorUtil string ProcessUnifiedHtml(string htmlForProcessing,string reportOutputFolder); Task GenerateAsync(IEnumerable coverOutputFiles,string reportOutputFolder, bool throwError = false); string BlankReport(bool withHistory); - System.Threading.Tasks.Task LogCoverageProcessAsync(string message); - System.Threading.Tasks.Task EndOfCoverageRunAsync(); + Task LogCoverageProcessAsync(string message); + Task EndOfCoverageRunAsync(); } internal class ReportGeneratorResult @@ -1686,14 +1687,14 @@ public string BlankReport(bool withHistory) return ProcessUnifiedHtml(resourceProvider.ReadResource("dummyReportToProcess.html"),null); } - public async System.Threading.Tasks.Task LogCoverageProcessAsync(string message) + public async Task LogCoverageProcessAsync(string message) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); eventAggregator.SendMessage(new InvokeScriptMessage(CoverageLogJSFunctionName, message)); logs.Add(message); } - public async System.Threading.Tasks.Task EndOfCoverageRunAsync() + public async Task EndOfCoverageRunAsync() { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); eventAggregator.SendMessage(new InvokeScriptMessage(ShowFCCWorkingJSFunctionName, false)); diff --git a/SharedProject/Impl/Logger.cs b/SharedProject/Impl/Logger.cs index 0f2b6af4..5a8f319b 100644 --- a/SharedProject/Impl/Logger.cs +++ b/SharedProject/Impl/Logger.cs @@ -10,10 +10,11 @@ using System.ComponentModel.Composition; using Microsoft; using EnvDTE; +using Task = System.Threading.Tasks.Task; interface IShowFCCOutputPane { - System.Threading.Tasks.Task ShowAsync(); + Task ShowAsync(); } [Export(typeof(IShowFCCOutputPane))] [Export(typeof(ILogger))] @@ -154,7 +155,7 @@ public void LogWithoutTitle(IEnumerable message) LogImpl(message.ToArray(), false); } - public async System.Threading.Tasks.Task ShowAsync() + public async Task ShowAsync() { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); diff --git a/SharedProject/Output/OutputToolWindowPackage.cs b/SharedProject/Output/OutputToolWindowPackage.cs index c3d285d2..9218dfca 100644 --- a/SharedProject/Output/OutputToolWindowPackage.cs +++ b/SharedProject/Output/OutputToolWindowPackage.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using System.Diagnostics.CodeAnalysis; using System.ComponentModel.Composition; +using System.Threading.Tasks; using Task = System.Threading.Tasks.Task; using Microsoft.VisualStudio.Shell.Interop; using EnvDTE80; @@ -91,9 +92,9 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke await ClearUICommand.InitializeAsync(this, componentModel.GetService()); } - protected override System.Threading.Tasks.Task InitializeToolWindowAsync(Type toolWindowType, int id, CancellationToken cancellationToken) + protected override Task InitializeToolWindowAsync(Type toolWindowType, int id, CancellationToken cancellationToken) { - return System.Threading.Tasks.Task.FromResult(GetOutputToolWindowContext()); + return Task.FromResult(GetOutputToolWindowContext()); } public override IVsAsyncToolWindowFactory GetAsyncToolWindowFactory(Guid toolWindowType) { From 80967517a84f7bb8a6f6ba0fd1fa970821b06133 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 09:36:12 +0000 Subject: [PATCH 02/10] remove unnecessary suppressions / replace with ThrowIfNotOnUIThread --- SharedProject/Options/AppOptions.cs | 1 - SharedProject/Options/AppOptionsProvider.cs | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/SharedProject/Options/AppOptions.cs b/SharedProject/Options/AppOptions.cs index 65ad9b6a..cd998dd5 100644 --- a/SharedProject/Options/AppOptions.cs +++ b/SharedProject/Options/AppOptions.cs @@ -175,7 +175,6 @@ You can also ignore additional attributes by adding to this list (short name or [Description("Set to true to hide classes, namespaces and assemblies that are fully covered.")] public bool HideFullyCovered { get; set; } - [SuppressMessage("Usage", "VSTHRD010:Invoke single-threaded types on Main thread")] public override void SaveSettingsToStorage() { AppOptionsStorageProvider.SaveSettingsToStorage(this); diff --git a/SharedProject/Options/AppOptionsProvider.cs b/SharedProject/Options/AppOptionsProvider.cs index 4542ea99..98ceb374 100644 --- a/SharedProject/Options/AppOptionsProvider.cs +++ b/SharedProject/Options/AppOptionsProvider.cs @@ -35,9 +35,9 @@ public IAppOptions Get() return options; } - [SuppressMessage("Usage", "VSTHRD010:Invoke single-threaded types on Main thread")] private WritableSettingsStore EnsureStore() { + ThreadHelper.ThrowIfNotOnUIThread(); var settingsManager = new ShellSettingsManager(ServiceProvider.GlobalProvider); var settingsStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); @@ -53,7 +53,6 @@ private PropertyInfo[] ReflectProperties() return AppOptionsType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); } - [SuppressMessage("Usage", "VSTHRD010:Invoke single-threaded types on Main thread")] public void LoadSettingsFromStorage(AppOptions instance) { var settingsStore = EnsureStore(); @@ -85,7 +84,7 @@ public void LoadSettingsFromStorage(AppOptions instance) } } } - [SuppressMessage("Usage", "VSTHRD010:Invoke single-threaded types on Main thread")] + public void SaveSettingsToStorage(AppOptions appOptions) { var settingsStore = EnsureStore(); From 3b932086c788eb0b395a6f137b78702b5b77165d Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 13:15:03 +0000 Subject: [PATCH 03/10] async event handler use JoinableTaskfactory.RunAsync --- SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs b/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs index 75f25472..ed8d0d94 100644 --- a/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs +++ b/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs @@ -125,12 +125,12 @@ IEventAggregator eventAggregator scriptManager.ShowFCCOutputPaneEvent += ScriptManager_ShowFCCOutputPaneEvent; } - private async void ScriptManager_ShowFCCOutputPaneEvent(object sender, EventArgs e) + private void ScriptManager_ShowFCCOutputPaneEvent(object sender, EventArgs e) { - await showFCCOutputPane.ShowAsync(); + ThreadHelper.JoinableTaskFactory.RunAsync(() => showFCCOutputPane.ShowAsync()); } - private void ScriptManager_ClearFCCWindowLogsEvent(object sender, EventArgs e) + private void ScriptManager_ClearFCCWindowLogsEvent(object sender, EventArgs e) { logs.Clear(); } From f76db52f99c46160b8228ff84cf48b71e46e7a59 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 13:47:32 +0000 Subject: [PATCH 04/10] discard fire and forget JoinableTask --- SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs b/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs index ed8d0d94..12d442c2 100644 --- a/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs +++ b/SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs @@ -127,7 +127,7 @@ IEventAggregator eventAggregator private void ScriptManager_ShowFCCOutputPaneEvent(object sender, EventArgs e) { - ThreadHelper.JoinableTaskFactory.RunAsync(() => showFCCOutputPane.ShowAsync()); + _ = ThreadHelper.JoinableTaskFactory.RunAsync(() => showFCCOutputPane.ShowAsync()); } private void ScriptManager_ClearFCCWindowLogsEvent(object sender, EventArgs e) From a1f6fa110a12537426e91d3819cd630b94288101 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 14:12:10 +0000 Subject: [PATCH 05/10] CoverageColorProvider replace ThrowIfNotOnUIThread with SwitchToMainThreadAsync. --- SharedProject/Impl/CoverageColorProvider.cs | 49 +++++++++++---------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/SharedProject/Impl/CoverageColorProvider.cs b/SharedProject/Impl/CoverageColorProvider.cs index 749407c3..18b6f9d9 100644 --- a/SharedProject/Impl/CoverageColorProvider.cs +++ b/SharedProject/Impl/CoverageColorProvider.cs @@ -102,29 +102,33 @@ private void UpdateFromFontsAndColorsIfNecessary() private void UpdateColoursFromFontsAndColors() { - ThreadHelper.ThrowIfNotOnUIThread(); - var success = fontAndColorStorage.OpenCategory(ref categoryWithCoverage, storeFlags); - if (success == VSConstants.S_OK) + ThreadHelper.JoinableTaskFactory.Run(async () => { - CoverageTouchedArea = GetColor("Coverage Touched Area"); - CoverageNotTouchedArea = GetColor("Coverage Not Touched Area"); - CoveragePartiallyTouchedArea = GetColor("Coverage Partially Touched Area"); - } - fontAndColorStorage.CloseCategory(); - //throw ? - requiresFromFontsAndColours = false; - } - - private System.Windows.Media.Color GetColor(string displayName) - { - ThreadHelper.ThrowIfNotOnUIThread(); - var touchAreaInfo = new ColorableItemInfo[1]; - var getItemSuccess = fontAndColorStorage.GetItem(displayName, touchAreaInfo); - if (getItemSuccess == VSConstants.S_OK) - { - return ParseColor(touchAreaInfo[0].crBackground); - } - throw new Exception("Failed to get color"); + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + var success = fontAndColorStorage.OpenCategory(ref categoryWithCoverage, storeFlags); + if (success == VSConstants.S_OK) + { + // https://github.com/microsoft/vs-threading/issues/993 + System.Windows.Media.Color GetColor(string displayName) + { + var touchAreaInfo = new ColorableItemInfo[1]; + var getItemSuccess = fontAndColorStorage.GetItem(displayName, touchAreaInfo); + if (getItemSuccess == VSConstants.S_OK) + { + return ParseColor(touchAreaInfo[0].crBackground); + } + throw new Exception("Failed to get color"); + } + + CoverageTouchedArea = GetColor("Coverage Touched Area"); + CoverageNotTouchedArea = GetColor("Coverage Not Touched Area"); + CoveragePartiallyTouchedArea = GetColor("Coverage Partially Touched Area"); + } + fontAndColorStorage.CloseCategory(); + //throw ? + requiresFromFontsAndColours = false; + }); + } private System.Windows.Media.Color ParseColor(uint color) @@ -133,7 +137,6 @@ private System.Windows.Media.Color ParseColor(uint color) return System.Windows.Media.Color.FromArgb(dcolor.A, dcolor.R, dcolor.G, dcolor.B); } - } } \ No newline at end of file From 9ef521ded8756d5142494ee7515c3611cdad4e80 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 14:14:46 +0000 Subject: [PATCH 06/10] transitive propagation of UI thread requirements --- SharedProject/Options/AppOptionsProvider.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SharedProject/Options/AppOptionsProvider.cs b/SharedProject/Options/AppOptionsProvider.cs index 98ceb374..f71f50e3 100644 --- a/SharedProject/Options/AppOptionsProvider.cs +++ b/SharedProject/Options/AppOptionsProvider.cs @@ -31,6 +31,7 @@ public void RaiseOptionsChanged(IAppOptions appOptions) public IAppOptions Get() { var options = new AppOptions(true); + ThreadHelper.ThrowIfNotOnUIThread(); LoadSettingsFromStorage(options); return options; } @@ -55,6 +56,7 @@ private PropertyInfo[] ReflectProperties() public void LoadSettingsFromStorage(AppOptions instance) { + ThreadHelper.ThrowIfNotOnUIThread(); var settingsStore = EnsureStore(); @@ -87,6 +89,7 @@ public void LoadSettingsFromStorage(AppOptions instance) public void SaveSettingsToStorage(AppOptions appOptions) { + ThreadHelper.ThrowIfNotOnUIThread(); var settingsStore = EnsureStore(); foreach (var property in ReflectProperties()) From 0b83b9a5664ef55c405de28fb0f46eab358820dc Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 14:27:14 +0000 Subject: [PATCH 07/10] async package tool window invocation within command --- .../PackageInitializer.cs | 4 +-- .../Output/OutputToolWindowCommand.cs | 33 +++++++------------ 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/SharedProject/Impl/TestContainerDiscovery/PackageInitializer.cs b/SharedProject/Impl/TestContainerDiscovery/PackageInitializer.cs index 4d7c0d26..b3f93e39 100644 --- a/SharedProject/Impl/TestContainerDiscovery/PackageInitializer.cs +++ b/SharedProject/Impl/TestContainerDiscovery/PackageInitializer.cs @@ -41,12 +41,12 @@ public void Initialize() if (File.Exists(outputWindowInitializedFile)) { - OutputToolWindowCommand.Instance.FindToolWindow(); + await OutputToolWindowCommand.Instance.FindToolWindowAsync(); } else { // for first time users, the window is automatically docked - OutputToolWindowCommand.Instance.ShowToolWindow(); + await OutputToolWindowCommand.Instance.ShowToolWindowAsync(); File.WriteAllText(outputWindowInitializedFile, string.Empty); } } diff --git a/SharedProject/Output/OutputToolWindowCommand.cs b/SharedProject/Output/OutputToolWindowCommand.cs index 669e3ead..5b560e43 100644 --- a/SharedProject/Output/OutputToolWindowCommand.cs +++ b/SharedProject/Output/OutputToolWindowCommand.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel.Design; using Microsoft.VisualStudio.Shell; +using System.Threading.Tasks; using Task = System.Threading.Tasks.Task; namespace FineCodeCoverage.Output @@ -82,39 +83,29 @@ public static async Task InitializeAsync(AsyncPackage package) /// The event args. public void Execute(object sender, EventArgs e) { - ShowToolWindow(); + _ = ThreadHelper.JoinableTaskFactory.RunAsync(ShowToolWindowAsync); } - public ToolWindowPane ShowToolWindow() + public async Task ShowToolWindowAsync() { - ToolWindowPane window = null; + ToolWindowPane window = await package.ShowToolWindowAsync(typeof(OutputToolWindow), 0, true, package.DisposalToken); - package.JoinableTaskFactory.RunAsync(async delegate + if ((null == window) || (null == window.Frame)) { - window = await package.ShowToolWindowAsync(typeof(OutputToolWindow), 0, true, package.DisposalToken); - - if ((null == window) || (null == window.Frame)) - { - throw new NotSupportedException($"Cannot create '{Vsix.Name}' output window"); - } - }); + throw new NotSupportedException($"Cannot create '{Vsix.Name}' output window"); + } return window; } - public ToolWindowPane FindToolWindow() + public async Task FindToolWindowAsync() { - ToolWindowPane window = null; + ToolWindowPane window = await package.FindToolWindowAsync(typeof(OutputToolWindow), 0, true, package.DisposalToken); - package.JoinableTaskFactory.RunAsync(async delegate + if ((null == window) || (null == window.Frame)) { - window = await package.FindToolWindowAsync(typeof(OutputToolWindow), 0, true, package.DisposalToken); - - if ((null == window) || (null == window.Frame)) - { - throw new NotSupportedException($"Cannot create '{Vsix.Name}' output window"); - } - }); + throw new NotSupportedException($"Cannot create '{Vsix.Name}' output window"); + } return window; } From fa3ae7a326267e776a30c10aadc717186ecb33d9 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 14:48:36 +0000 Subject: [PATCH 08/10] vsthrd010 logger refactor --- SharedProject/Impl/Logger.cs | 44 ++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/SharedProject/Impl/Logger.cs b/SharedProject/Impl/Logger.cs index 5a8f319b..de99c0d1 100644 --- a/SharedProject/Impl/Logger.cs +++ b/SharedProject/Impl/Logger.cs @@ -36,33 +36,27 @@ IServiceProvider serviceProvider staticLogger = this; } - IVsOutputWindowPane CreatePane(Guid paneGuid, string title, - bool visible, bool clearWithSolution) - { - - ThreadHelper.ThrowIfNotOnUIThread(); - _outputWindow = (IVsOutputWindow)_serviceProvider.GetService(typeof(SVsOutputWindow)); - Assumes.Present(_outputWindow); - dte = (EnvDTE.DTE)_serviceProvider.GetService(typeof(EnvDTE.DTE)); - Assumes.Present(dte); - - // Create a new pane. - _outputWindow.CreatePane( - ref paneGuid, - title, - Convert.ToInt32(visible), - Convert.ToInt32(clearWithSolution)); - - // Retrieve the new pane. - _outputWindow.GetPane(ref paneGuid, out IVsOutputWindowPane pane); - return pane; - } - private void SetPane() { - ThreadHelper.ThrowIfNotOnUIThread(); - // do not clear with solution otherwise will not get initialize methods - _pane = CreatePane(fccPaneGuid, "FCC", true, false); + ThreadHelper.JoinableTaskFactory.Run(async () => + { + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + _outputWindow = (IVsOutputWindow)_serviceProvider.GetService(typeof(SVsOutputWindow)); + Assumes.Present(_outputWindow); + dte = (EnvDTE.DTE)_serviceProvider.GetService(typeof(EnvDTE.DTE)); + Assumes.Present(dte); + + // Create a new pane. + _outputWindow.CreatePane( + ref fccPaneGuid, + "FCC", + Convert.ToInt32(true), + Convert.ToInt32(false)); // do not clear with solution otherwise will not get initialize methods + + // Retrieve the new pane. + _outputWindow.GetPane(ref fccPaneGuid, out IVsOutputWindowPane pane); + _pane = pane; + }); } [SuppressMessage("Usage", "VSTHRD102:Implement internal logic asynchronously")] From 900ae4c1072c55a32cfe9c93d3b880710f0e5eaa Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 14:50:20 +0000 Subject: [PATCH 09/10] AppOptionsProvider EnsureStore SwitchToMainThreadAsync --- SharedProject/Options/AppOptionsProvider.cs | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/SharedProject/Options/AppOptionsProvider.cs b/SharedProject/Options/AppOptionsProvider.cs index f71f50e3..58c6a549 100644 --- a/SharedProject/Options/AppOptionsProvider.cs +++ b/SharedProject/Options/AppOptionsProvider.cs @@ -31,21 +31,25 @@ public void RaiseOptionsChanged(IAppOptions appOptions) public IAppOptions Get() { var options = new AppOptions(true); - ThreadHelper.ThrowIfNotOnUIThread(); LoadSettingsFromStorage(options); return options; } private WritableSettingsStore EnsureStore() { - ThreadHelper.ThrowIfNotOnUIThread(); - var settingsManager = new ShellSettingsManager(ServiceProvider.GlobalProvider); - var settingsStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); - - if (!settingsStore.CollectionExists(Vsix.Code)) + WritableSettingsStore settingsStore = null; + ThreadHelper.JoinableTaskFactory.Run(async () => { - settingsStore.CreateCollection(Vsix.Code); - } + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + var settingsManager = new ShellSettingsManager(ServiceProvider.GlobalProvider); + settingsStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); + + if (!settingsStore.CollectionExists(Vsix.Code)) + { + settingsStore.CreateCollection(Vsix.Code); + } + }); + return settingsStore; } @@ -56,7 +60,6 @@ private PropertyInfo[] ReflectProperties() public void LoadSettingsFromStorage(AppOptions instance) { - ThreadHelper.ThrowIfNotOnUIThread(); var settingsStore = EnsureStore(); @@ -89,7 +92,6 @@ public void LoadSettingsFromStorage(AppOptions instance) public void SaveSettingsToStorage(AppOptions appOptions) { - ThreadHelper.ThrowIfNotOnUIThread(); var settingsStore = EnsureStore(); foreach (var property in ReflectProperties()) From d4587e1a4301300ab3b8ab3fb01f79ffc13cf237 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Tue, 1 Mar 2022 15:29:15 +0000 Subject: [PATCH 10/10] fix VS2022 bug DTE vs DTE2 --- SharedProject/Impl/Logger.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SharedProject/Impl/Logger.cs b/SharedProject/Impl/Logger.cs index de99c0d1..ea319ca8 100644 --- a/SharedProject/Impl/Logger.cs +++ b/SharedProject/Impl/Logger.cs @@ -2,15 +2,14 @@ using System.Linq; using FineCodeCoverage; using System.Diagnostics; -using Microsoft.VisualStudio; using System.Collections.Generic; using Microsoft.VisualStudio.Shell; using System.Diagnostics.CodeAnalysis; using Microsoft.VisualStudio.Shell.Interop; using System.ComponentModel.Composition; using Microsoft; -using EnvDTE; using Task = System.Threading.Tasks.Task; +using EnvDTE80; interface IShowFCCOutputPane { @@ -22,7 +21,7 @@ public class Logger : ILogger, IShowFCCOutputPane { private IVsOutputWindowPane _pane; private IVsOutputWindow _outputWindow; - private DTE dte; + private DTE2 dte; private readonly IServiceProvider _serviceProvider; private Guid fccPaneGuid = Guid.Parse("3B3C775A-0050-445D-9022-0230957805B2"); @@ -43,7 +42,7 @@ private void SetPane() await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); _outputWindow = (IVsOutputWindow)_serviceProvider.GetService(typeof(SVsOutputWindow)); Assumes.Present(_outputWindow); - dte = (EnvDTE.DTE)_serviceProvider.GetService(typeof(EnvDTE.DTE)); + dte = (DTE2)_serviceProvider.GetService(typeof(EnvDTE.DTE)); Assumes.Present(dte); // Create a new pane.