visual-studio - 特定文件的 Visual Studio 自定义编辑器

标签 visual-studio visual-studio-extensions vsix visual-studio-package

上下文:

我正在为 Visual Studio 2017 创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“manifest.json”的文件。

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

我已经在 Microsoft Doc 上找到了几篇文章(例如 Create custom editors and designers),并找到了一些关于创建自定义编辑器和自定义设计器的 GitHub 示例(例如 Editor_With_ToolboxSingleFileGeneratorWPFDesigner_XMLSnippet Designer) .

问题:

  • 大部分文章、示例和文档都解释了如何将自定义编辑器与特定文件扩展名相关联(在我的例子中,我想将编辑器与特定文件“manifest.json”相关联项目)。
  • 与单个文件生成器相关的文章,它们不适合我的解决方案,因为它们谈到了在设计器中编辑了一个文件,而在解决方案中发出了另一个文件(如 windows 窗体设计器)。

总结:

我想实现仅针对我的自定义项目模板中的特定文件运行的 Visual Studio 自定义编辑器\设计器。如何做到这一点?

注意事项:

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

最佳答案

最后在开源示例支持的大量尝试和错误方法之后,我通过以下步骤解决了我的问题:

  1. 像问题中发布的任何示例一样正常实现自定义编辑器(如 Editor With Toolbox)。
  2. 在编辑器工厂类(实现IVsEditorFactory的类)中,在CreateEditorInstance函数中,您可以设置这样的条件来将编辑器限制为特定的JSON文件姓名:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
  1. 为了将我们的自定义编辑器限制为特定的自定义项目,我们需要在模板项目文件 (ProjectTemplate.csproj) 中使用元数据标记我们的目标文件(要了解有关元数据的更多信息,请查找 msbuild 元数据)如下:
<Content Include="manifest.json" >
    <IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>
  1. 为了检查编辑器工厂中的元数据,我们将在 CreateEditorInstance 函数中继续我们的工作,如下所示:

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

    4.2 使用这2个参数获取父项目的IVsBuildPropertyStorage(网上有部分代码示例)。

    4.3 使用此代码检查我们的标记元数据:

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

使用此自定义编辑器完成自定义项目后,我将发布其 GitHub 链接以更清晰。

关于visual-studio - 特定文件的 Visual Studio 自定义编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53965749/

相关文章:

c++ - 从赋值运算符函数调用复制构造函数

c# - 执行代码修复后如何将插入符号移动到特定位置

c# - 有没有办法在 Visual Studio 扩展窗口中托管 C# 代码编辑器

visual-studio-2012 - 带有项目模板和 NuGet 包的 VSIX

c# - 在 Visual Studio 扩展中打开标准对话框

c# - "Copy if newer"文件更新时为什么不复制文件?

visual-studio - 如何在 TFS 上创建分支并将挂起的更改附加到新分支

c++ - "Fatal error C1083: Cannot open include file"但我已将目录添加到项目

visual-studio-2015 - Visual Studio 2015。如何查找具有特定类的较少文件

visual-studio-2010 - 使用 VSIX 为项目模板部署包含 IWizard 的程序集