У меня есть проект DSL-tools, в котором я использую [ProvideAutoLoad]
, потому что он добавляет в Visual Studio набор команд меню, позволяющих пользователю преобразовывать код (у нас есть много текстовых шаблонов) и многое другое.
Поскольку VS2019 не позволяет чтобы больше не загружать пакеты синхронизации, я получаю эти раздражающие предупреждения, даже когда включена опция, разрешающая автозагрузку.
Очевидно, Microsoft не планирует предоставлять асинхронную версию ModelingPackage
(я действительно начинаю сомневаться, не мешают ли они полностью отказаться от DSL-инструментов).
Кто-нибудь нашел способ обойти это?
Я попытался использовать другой пакет, построенный как AsyncPackage
, чтобы один из них загрузил мой пакет DSL-tools на InitializeAsync()
, но в итоге я получаю всевозможные исключения, использующие службу IVsShell
.
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<VSShell.ServiceProgressData> progress)
{
// Default behavior
await base.InitializeAsync(cancellationToken, progress).ConfigureAwait(false);
// Load the service designer package
this.EnsureDesignerPackage();
// Switche to the UI thread
await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
// Menu commands
this.InitializeMenuCommands();
}
private void EnsureDesignerPackage()
{
// Package already loaded?
if (!this.IsDesignerPackageLoaded())
{
this.LoadDesignerPackage();
}
}
private bool IsDesignerPackageLoaded()
{
// Package identifier
Guid packageId = new Guid(GlobalConstants.ServiceDesignerPackageId);
// Is loaded?
IVsShell service = this.VsShellService;
int hr = this.VsShellService.IsPackageLoaded(ref packageId, out IVsPackage package);
if (ErrorHandler.Succeeded(hr) && package != null)
{
return true;
}
// Default result
return false;
}
private void LoadDesignerPackage()
{
// Package identifier
Guid packageId = new Guid(GlobalConstants.ServiceDesignerPackageId);
// Not loaded?
int hr = this.VsShellService.IsPackageLoaded(ref packageId, out IVsPackage package);
if (hr != VSConstants.S_OK || package == null)
{
// Load
hr = this.VsShellService.LoadPackage(ref packageId, out package);
if (ErrorHandler.Failed(hr))
{
string message = "Service designer loading failed: {0}.".Format().With(hr);
this.ShowException(message);
}
}
}