我正在为visual studio 2017创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“manifest.json”的文件。
我需要为“manifest.json”文件创建自定义编辑器\ designer,当用户在“解决方案资源管理器”中双击该文件时,它会打开我的自定义编辑器。
我已经在Microsoft Doc上找到了一些文章(比如这个Create custom editors and designers),并发现了一些关于创建自定义编辑器和自定义设计器的GitHub示例(如Editor_With_Toolbox,SingleFileGenerator,WPFDesigner_XML和Snippet Designer)。
我想实现只为我的自定义项目模板中的特定文件运行的visual studio自定义编辑器\设计器。怎么做到这一点?
最后,在开源示例支持的大量尝试和错误方法之后,我通过以下步骤解决了我的问题:
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>
CreateEditorInstance
函数中的工作,如下所示:
4.1我们已经将这两个参数传递给CreateEditorInstance
函数:(IVsHierarchy pvHier
和uint itemid
)。
4.2使用这两个参数获取父项目的IVsBuildPropertyStorage
(某些代码示例在线存在)。
4.3使用此代码检查我们的标记元数据:buildPropertyStorage.GetItemAttribute(itemid, "IsWebExtensionManifest", out string propVal);
if (!Convert.ToBoolean(propVal))
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
一旦我使用此自定义编辑器完成自定义项目,我将发布其GitHub链接以获得更清晰的信息。