Использование FindToolWindow в AsyncPackage VSIX 2015 во время InitializeAsync - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь перенести vsix, который использует Package, в AsyncPackage.

Проблема в том, что изначально метод переопределения инициализации в моем пакете использовал

ToolWindowPane pane = FindToolWindow(typeof(ToolWindow1), 0, true);

чтобы перейти к UserControl, который находится внутри окна инструмента.

Однако после обновления использовать AsyncPackage, например.

[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] // Info on this package for Help/About
[ProvideMenuResource("Menus.ctmenu", 1)]
[ProvideToolWindow(typeof(ToolWindow1))]
[Microsoft.VisualStudio.Shell.ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)]
[Guid(ToolWindow1Package.PackageGuidString)]
[ProvideToolWindowVisibility(typeof(ToolWindow1), /*UICONTEXT_SolutionExists*/"f1536ef8-92ec-443c-9ed7-fdadf150da82")]

public sealed class ToolWindow1Package : AsyncPackage


        protected override async System.Threading.Tasks.Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
        {

            //await JoinableTaskFactory.SwitchToMainThreadAsync();
            ToolWindow1Command.Initialize(this, JoinableTaskFactory);

            ToolWindowPane pane = FindToolWindow(typeof(ToolWindow1), 0, true);
             await base.InitializeAsync(cancellationToken, progress);
            return;

        }

вызов FindToolWindow завершается неудачно, с этим в ActivityLog.xml

Construction of frame content failed.&#x000D;&#x000A;Frame identifier: ST:0:0:{deb760b0-be7a-4e88-9ef3-c09cfa7c16da}&#x000D;&#x000A;
Frame caption: ToolWindow1&#x000D;&#x000A;Exception details:&#x000D;&#x000A;System.Reflection.TargetInvocationException: 
Exception has been thrown by the target of an invocation.&#x000D;&#x000A;   at Microsoft.VisualStudio.Shell.Interop.IVsShell5.LoadPackageWithContext(Guid&amp; packageGuid, Int32 reason, Guid&amp; context)&#x000D;&#x000A;   at Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.GetPackage()&#x000D;&#x000A;   at Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.ConstructContent()

Если я раскомментирую строку await JoinableTaskFactory.SwitchToMainThreadAsync(); в методе InitializeAsync, VS блокируется на FindToolWindow.

Итак, как я могу получить доступ к окну инструментов во время InitializeAsync?

Если я не могу, как бы я это сделал в кратчайшие сроки после инициализации?

1 Ответ

0 голосов
/ 15 марта 2019

Не уверен.Но, поскольку вы хотите перенести пакет в AsyncPackage, я думаю, что FindToolWindowAsync из AsyncPackage может быть более подходящим.

Package.FindToolWindow (Type, Int32, Boolean) Метод

AsyncPackage.FindToolWindowAsync (Type, Int32, Boolean, CancellationToken) Метод

...