【问题标题】:VS SDK ContentType does not workVS SDK ContentType 不起作用
【发布时间】:2014-10-28 11:16:26
【问题描述】:

我正在尝试为 Visual Studio 添加自定义语言支持。

首先,我需要GoToDefinition 支持。我正在努力让上下文菜单包含这个命令。

我定义了一个ContentTypeDefinition 并包含了FileExtensionToContentTypeDefinition,例如:

internal sealed class GaugeFileContentType
{
    [Export]
    [Name("Gauge")]
    [BaseDefinition("code")]
    internal static ContentTypeDefinition GaugeContentTypeDefinition = null;

    [Export]
    [FileExtension(".spec")]
    [ContentType("Gauge")]
    internal static FileExtensionToContentTypeDefinition GaugeFileExtensionDefinition = null;
}

尽管如此,在调试时,我看到 DTE.ActiveDocument.Typetext,尽管我添加了 [BaseDefinition('code')] 属性。我在这里错过了什么?

以上定义是否足以告诉 Visual Studio 为代码调出上下文菜单?

我正在使用 Visual Studio 2013 Ultimate。

【问题讨论】:

    标签: c# visual-studio-extensions envdte visual-studio-sdk


    【解决方案1】:

    经过几天的头撞,我设法找到了办法。

    我使用 Experimental Instance 进行调试,它没有清理并重新安装扩展,因此 Visual Studio 继续将 ContentType 视为“纯文本”,因为那是我最初的。

    当我构建 VSIX 并安装时,在 Visual Studio 的新实例中打开相同的文件时,它会显示正确的上下文菜单。

    但是,它带来的效果超出了我的预期(即来自 Resharper 的 Run Unit Tests)。所以我做了更多的挖掘工作。

    为了确保 Visual Studio 可以处理命令,它通过调用 IOleCommandTarget.QueryStatus 方法来检查它。

    我所要做的就是将 CommandFlag 设置为 (uint)OLECMDF.OLECMDF_ENABLED | (uint)OLECMDF.OLECMDF_SUPPORTED 并在 cmdIdVSConstants.VSStd97CmdID.GotoDefn 时返回 VSConstants.S_OK

    最终的方法如下所示:

    public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
    {
        if ((VSConstants.VSStd97CmdID)prgCmds[0].cmdID == VSConstants.VSStd97CmdID.GotoDefn)
        {
            prgCmds[0].cmdf = (uint)OLECMDF.OLECMDF_ENABLED | (uint)OLECMDF.OLECMDF_SUPPORTED;
            return VSConstants.S_OK;
        }
        return Next.QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2013-12-16
      • 2013-06-10
      • 1970-01-01
      • 2011-09-08
      • 2018-02-04
      相关资源
      最近更新 更多