diff --git a/source/Cosmos.VS.DebugEngine/Cosmos.VS.DebugEngine.csproj b/source/Cosmos.VS.DebugEngine/Cosmos.VS.DebugEngine.csproj index 8c980c75d..84391ed7e 100644 --- a/source/Cosmos.VS.DebugEngine/Cosmos.VS.DebugEngine.csproj +++ b/source/Cosmos.VS.DebugEngine/Cosmos.VS.DebugEngine.csproj @@ -26,8 +26,8 @@ - - + + diff --git a/source/Cosmos.VS.DebugEngine/CosmosDebugEnginePackage.cs b/source/Cosmos.VS.DebugEngine/CosmosDebugEnginePackage.cs index 2bacf1811..e08eb6686 100644 --- a/source/Cosmos.VS.DebugEngine/CosmosDebugEnginePackage.cs +++ b/source/Cosmos.VS.DebugEngine/CosmosDebugEnginePackage.cs @@ -1,7 +1,9 @@ using System; using System.Runtime.InteropServices; +using System.Threading; using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio.Shell; +using Task = System.Threading.Tasks.Task; using Cosmos.VS.DebugEngine.Commands; @@ -32,24 +34,30 @@ using Cosmos.VS.DebugEngine.Commands; namespace Cosmos.VS.DebugEngine { [Guid(Guids.guidPackageString)] - [PackageRegistration(UseManagedResourcesOnly = true)] + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [ProvideMenuResource("Menus.ctmenu", 1)] - internal sealed class CosmosDebugEnginePackage : Package, IOleCommandTarget + internal sealed class CosmosDebugEnginePackage : AsyncPackage, IOleCommandTarget { private IOleCommandTarget packageCommandTarget; private DebugCommandHandler packageCommandHandler; - protected override void Initialize() + protected override async Task InitializeAsync( + CancellationToken cancellationToken, + IProgress progress) { - base.Initialize(); + await base.InitializeAsync(cancellationToken, progress); - packageCommandTarget = GetService(typeof(IOleCommandTarget)) as IOleCommandTarget; + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + packageCommandTarget = await GetServiceAsync(typeof(IOleCommandTarget)).ConfigureAwait(true) as IOleCommandTarget; packageCommandHandler = new DebugCommandHandler(this); } int IOleCommandTarget.Exec(ref Guid cmdGroup, uint nCmdID, uint nCmdExecOpt, IntPtr pvaIn, IntPtr pvaOut) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (cmdGroup == Guids.DebugEngineCmdSetGuid) { return packageCommandHandler.Execute(nCmdID, nCmdExecOpt, pvaIn, pvaOut); @@ -60,6 +68,8 @@ namespace Cosmos.VS.DebugEngine int IOleCommandTarget.QueryStatus(ref Guid cmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (cmdGroup == Guids.DebugEngineCmdSetGuid) { return packageCommandHandler.Query(cCmds, prgCmds, pCmdText); diff --git a/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj b/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj index 3577ab1ed..3737c5edf 100644 --- a/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj +++ b/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj @@ -62,12 +62,9 @@ - - - - + diff --git a/source/Cosmos.VS.ProjectSystem/CosmosProjectSystemPackage.cs b/source/Cosmos.VS.ProjectSystem/CosmosProjectSystemPackage.cs index 566609bfe..5429dc68c 100644 --- a/source/Cosmos.VS.ProjectSystem/CosmosProjectSystemPackage.cs +++ b/source/Cosmos.VS.ProjectSystem/CosmosProjectSystemPackage.cs @@ -1,18 +1,20 @@ using System; using System.Runtime.InteropServices; +using System.Threading; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using Task = System.Threading.Tasks.Task; using Cosmos.VS.ProjectSystem.VS.PropertyPages; namespace Cosmos.VS.ProjectSystem { [Guid(PackageGuid)] - [PackageRegistration(UseManagedResourcesOnly = true)] + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] [ProvideObject(typeof(OldCosmosPropertyPage))] [ProvideObject(typeof(CosmosPropertyPage))] [ProvideProjectFactory(typeof(MigrateCosmosProjectFactory), null, "Cosmos Project Files (*.Cosmos);*.Cosmos", "Cosmos", "Cosmos", null)] - internal class CosmosProjectSystemPackage : Package + internal class CosmosProjectSystemPackage : AsyncPackage { /// /// The GUID for this package. @@ -21,9 +23,13 @@ namespace Cosmos.VS.ProjectSystem private IVsProjectFactory _factory; - protected override void Initialize() + protected override async Task InitializeAsync( + CancellationToken cancellationToken, + IProgress progress) { - base.Initialize(); + await base.InitializeAsync(cancellationToken, progress).ConfigureAwait(false); + + await JoinableTaskFactory.SwitchToMainThreadAsync(); _factory = new MigrateCosmosProjectFactory(); RegisterProjectFactory(_factory); diff --git a/source/Cosmos.VS.Windows/Cosmos.VS.Windows.csproj b/source/Cosmos.VS.Windows/Cosmos.VS.Windows.csproj index 0d1c74e6a..73b6c4a0f 100644 --- a/source/Cosmos.VS.Windows/Cosmos.VS.Windows.csproj +++ b/source/Cosmos.VS.Windows/Cosmos.VS.Windows.csproj @@ -51,10 +51,7 @@ - - - - + diff --git a/source/Cosmos.VS.Windows/CosmosWindowsPackage.cs b/source/Cosmos.VS.Windows/CosmosWindowsPackage.cs index 329b506d5..cc59f0a56 100644 --- a/source/Cosmos.VS.Windows/CosmosWindowsPackage.cs +++ b/source/Cosmos.VS.Windows/CosmosWindowsPackage.cs @@ -2,11 +2,13 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; -using System.Timers; +using System.Threading; using System.Windows.Threading; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using Task = System.Threading.Tasks.Task; +using Timer = System.Timers.Timer; using Cosmos.Debug.Common; using Cosmos.Debug.DebugConnectors; @@ -16,14 +18,14 @@ using Cosmos.VS.Windows.ToolWindows; namespace Cosmos.VS.Windows { [Guid(Guids.PackageGuidString)] - [PackageRegistration(UseManagedResourcesOnly = true)] + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] [ProvideMenuResource("Menus.ctmenu", 1)] [ProvideToolWindow(typeof(AssemblyToolWindow))] [ProvideToolWindow(typeof(RegistersToolWindow))] [ProvideToolWindow(typeof(StackTW))] [ProvideToolWindow(typeof(InternalTW))] [ProvideToolWindow(typeof(ConsoleTW))] - public sealed class CosmosWindowsPackage: Package + public sealed class CosmosWindowsPackage: AsyncPackage { private readonly Queue mCommand; private readonly Queue mMessage; @@ -54,11 +56,15 @@ namespace Cosmos.VS.Windows mPipeDown.Start(); } - protected override void Initialize() + protected override async Task InitializeAsync( + CancellationToken cancellationToken, + IProgress progress) { - base.Initialize(); + await base.InitializeAsync(cancellationToken, progress); - var xOutputWindow = (IVsOutputWindow)GetService(typeof(SVsOutputWindow)); + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + var xOutputWindow = (IVsOutputWindow)await GetServiceAsync(typeof(SVsOutputWindow)); var xCosmosPaneGuid = Guid.NewGuid(); ErrorHandler.ThrowOnFailure(