我有一个DSL工具项目,我在其中使用[ProvideAutoLoad]
,因为它向Visual Studio添加了一组菜单命令,以允许用户转换代码(我们有很多文本模板)以及其他一些东西。
由于VS2019确实not allow to autoload sync packages anymore,即使启用了允许自动加载的选项,我也收到了令人讨厌的警告。
显然,微软没有计划提供ModelingPackage
的异步版本(实际上,我开始质疑它们是否不会完全终止DSL工具的使用)。
有没有人找到解决此问题的方法?
我尝试使用另一包-AsyncPackage
构建-以便将我的DSL工具包加载到InitializeAsync()
上,但是我最终使用{{1}遇到了各种异常}服务。
IVsShell
答案 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;
}
}
}
此致