Visual Studio 面向特定文件的自定义编辑器

4

背景:

我正在为 Visual Studio 2017 创建自定义项目模板,该模板运行良好。在此项目模板中,我会生成一个名为“manifest.json”的文件。

我需要为“manifest.json”文件创建自定义编辑器/设计器,以便当用户在“Solution Explorer”中双击此文件时,它将打开我的自定义编辑器。

我已经在 Microsoft Doc 上找到了一些文章(例如此文章),并且找到了一些关于创建自定义编辑器和自定义设计器的 GitHub 示例(例如Editor_With_ToolboxSingleFileGeneratorWPFDesigner_XMLSnippet Designer)。

问题:

  • 大多数文章、示例和文档都是解释如何将自定义编辑器与特定文件扩展名相关联(在我的情况下,我想将编辑器与特定项目中的特定文件“manifest.json”相关联)。
  • 与单个文件生成器相关的文章并不适用于我的解决方案,因为它们讲述的是在设计器中编辑一个文件,然后在解决方案中生成另一个文件(例如 Windows 表单设计器)。

总结:

我想实现 Visual Studio 自定义编辑器/设计器,仅运行于我的自定义项目模板中的特定文件。如何实现此目标?

注:

  • 要在自定义编辑器中关联的文件必须命名为“manifest.json”。
  • 如果其他项目类型中存在名为“manifest.json”的文件,则应执行标准编辑器而不是我的自定义编辑器。
1个回答

9

经过尝试和错误的方法,结合开源示例,我终于在以下步骤中解决了我的问题:

  1. 像任何问题中发布的示例一样正常实现自定义编辑器(例如带工具箱的编辑器)。
  2. 在编辑器工厂类中(即实现IVsEditorFactory的类)的CreateEditorInstance函数内,您可以添加如下条件来限制编辑器仅适用于特定名称的JSON文件:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}

为了将我们的自定义编辑器限制在特定的自定义项目中,我们需要在模板项目文件(ProjectTemplate.csproj)中为目标文件添加元数据(有关元数据的更多信息,请查看msbuild元数据)。具体方式如下:
<Content Include="manifest.json" >
    <IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>
  1. 为了检查编辑器工厂中的元数据,我们将在CreateEditorInstance函数中继续工作,具体如下:

    4.1 我们已经传递了这两个参数到CreateEditorInstance函数中:(IVsHierarchy pvHieruint itemid)。

    4.2 使用这两个参数获取父项目的IVsBuildPropertyStorage(一些代码示例可以在网上找到)。

    4.3 使用下面的代码来检查我们的标志元数据:

buildPropertyStorage.GetItemAttribute(itemid, "IsWebExtensionManifest", out string propVal);
if (!Convert.ToBoolean(propVal))
{
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}

一旦我用这个自定义编辑器完成了我的定制项目,我将发布其GitHub链接以获得更清晰的说明。

只是检查一下,你是否能够将自定义编辑器实现发布到 GitHub 上。 - Kaveesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接