如何在Visual Studio 2019中异步加载ModelingPackage(DSL-Tools)?

时间:2019-08-22 11:18:57

标签: vsix vs-extensibility vsx dsl-tools

我有一个DSL工具项目,我在其中使用[ProvideAutoLoad],因为它向Visual Studio添加了一组菜单命令,以允许用户转换代码(我们有很多文本模板)以及其他一些东西。

由于VS2019确实not allow to autoload sync packages anymore,即使启用了允许自动加载的选项,我也收到了令人讨厌的警告。

显然,微软没有计划提供ModelingPackage的异步版本(实际上,我开始质疑它们是否不会完全终止DSL工具的使用)。

有没有人找到解决此问题的方法?

我尝试使用另一包-AsyncPackage构建-以便将我的DSL工具包加载到InitializeAsync()上,但是我最终使用{{1}遇到了各种异常}服务。

IVsShell

1 个答案:

答案 0 :(得分:0)

我刚好在今天早些时候带领客户经历了同样的情况。不幸的是,我最后一次询问目前没有计划更新基础DSL框架以利用AsyncPackage或类似的东西。我看到您已经在dev community site中记录了一个建议,并且刚刚投票通过并添加了我自己的$ .02。我鼓励任何对此进行投票的人都可以对上面链接的建议进行投票。

要向您的DSL Package对象添加对异步加载的支持,您需要添加对Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime.dll程序集的引用,然后将Package.tt文件编辑为添加一个将AllowsBackgroundLoading设置为true的VSShell.PackageRegistration属性,并在同一类上实现IAsyncLoadablePackageInitialize接口。例如:

namespace <#= CodeGenerationUtilities.GetPackageNamespace(this.Dsl) #>
{
    /// <summary>
    /// Double-derived class to allow easier code customization.
    /// </summary>
    [VSShell::ProvideMenuResource("1000.ctmenu", 1)]
    [VSShell::ProvideToolboxItems(1)]
    [VSShell::PackageRegistration(AllowsBackgroundLoading = true)]
    [global::Microsoft.VisualStudio.TextTemplating.VSHost.ProvideDirectiveProcessor(typeof(global::<#= this.Dsl.Namespace #>.<#= directiveName #>DirectiveProcessor), global::<#= this.Dsl.Namespace #>.<#= directiveName #>DirectiveProcessor.<#= directiveName #>DirectiveProcessorName, "A directive processor that provides access to <#= directiveName #> files")]
    [global::System.Runtime.InteropServices.Guid(Constants.<#= dslName #>PackageId)]
    internal sealed partial class <#= dslName #>Package : <#= dslName #>PackageBase, VSShellInterop.IAsyncLoadablePackageInitialize
    {
        public VSShellInterop.IVsTask Initialize(VSShellInterop.IAsyncServiceProvider pServiceProvider, VSShellInterop.IProfferAsyncService pProfferService, VSShellInterop.IAsyncProgressCallback pProgressCallback)
        {
            // do async initialization here
            return null;
        }
    }
}

此致