Наконец, после большого количества попыток и ошибок, поддерживаемых примерами с открытым исходным кодом, я получил решение своей проблемы, выполнив следующие шаги:
- Внедряйте пользовательский редактор как обычно, как в любом из примеров, опубликованных ввопрос (например, Editor With Toolbox ).
- Внутри класса фабрики редактора (класс, который реализует
IVsEditorFactory
), внутри функции CreateEditorInstance
, вы можете сделать условие следующим образом:ограничить редактор JSON-файлами с определенным именем:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
Чтобы ограничить наш пользовательский редактор конкретным пользовательским проектом, нам нужно пометить наш целевой файл метаданными (чтобы узнать больше о метаданных, посмотрите метаданные msbuild) в файле проекта шаблона (
ProjectTemplate.csproj
) следующим образом:
<Content Include="manifest.json" >
<IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>
Чтобы проверить метаданные внутри фабрики редакторов, мы продолжим нашу работу в функции CreateEditorInstance
следующим образом:
4.1 У нас уже есть эти 2 параметра, переданные в CreateEditorInstance
function: (IVsHierarchy pvHier
и uint itemid
).
4.2 Используйте эти 2 параметра для получения IVsBuildPropertyStorage
родительского проекта (некоторые примеры кода существуют онлайн).
4.3 Используйте этот кодчтобы проверить метаданные нашей метки:
buildPropertyStorage.GetItemAttribute(itemid, "IsWebExtensionManifest", out string propVal);
if (!Convert.ToBoolean(propVal))
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
Как только я закончу свой пользовательский проект с помощью этого пользовательского редактора, я опубликую его ссылку на GitHub для большей ясности.