Visual Studio 2010: как создать и / или обновить определенный файл в проекте из расширения редактора? - PullRequest
2 голосов
/ 03 марта 2010

Я работаю над расширением проверки орфографии, которая недавно была обновлена ​​в галерее кодов: http://code.msdn.microsoft.com/spellCheckerSample

Я бы хотел обновить его, чтобы список слов "ignore" был взят из CustomDictionary.xml , того же файла, который используют инструменты статического анализа кода.

Из моего расширения редактора VS 2010 мне нужно:

  1. Найти проект, в котором находится текущий файл.
  2. Найдите файл "CustomDictionary.XML", если он существует.
  3. Если он существует, мне нужно проверить его из системы контроля версий
  4. Если его не существует, мне нужно добавить его в текущий проект (и в систему контроля версий)
  5. Добавление текста в файл CustomDictionary.XML (это самая простая часть).

Кто-нибудь знает какие-нибудь примеры, которые помогли бы мне научиться делать это? Я использую кандидата на выпуск VS2010.

Спасибо.

~ Кэмерон

Вот что у меня есть:

public ISpellingDictionaryService GetSpellingDictionaryService(ITextBuffer textBuffer)
{
    var bufferAdapter = AdaptersFactory.GetBufferAdapter(textBuffer);
    if (bufferAdapter != null)
    {
        var extensibleObject = bufferAdapter as IExtensibleObject;
        if (extensibleObject != null)
        {
            object document;
            extensibleObject.GetAutomationObject("Document", null, out document);
            // Control never gets here... GetAutomationObject appears to recurse.
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 06 марта 2010

Во-первых, вероятно, было бы лучше использовать расширение обновленной версии образца средства проверки правописания, которое я выпустил; вы можете взять источник на github .

Найти проект данного буфера

Если вы начнете с ITextBuffer, вы можете добраться до DTE Project, выполнив:

  1. В любой компонент MEF, который у вас есть (для проверки орфографии, SpellingDictionaryService - лучшее место), добавьте следующий импорт MEF:

    [Импорт] IVsEditorAdaptersFactoryService AdaptersFactory = null;

    Также добавьте ссылку на Microsoft.VisualStudio.Editor.dll в проект, если его там еще нет.

  2. Либо измените методы на ISpellingDictionaryService, чтобы они также взяли ITextBuffer, либо измените службу, чтобы она возвращала экземпляр словаря правописания, специфичный для буфера / проекта (и тогда методы не должны иметь один передается явно для каждого вызова).
  3. Используйте AdaptersFactory.GetBufferAdapter, чтобы получить буферный адаптер VS (IVsTextBuffer).
  4. Приведите это к IExtensibleObject и вызовите IExtensibleObject.GetAutomationObject("Document"), чтобы получить DTE Document для буфера.
  5. Здесь вы можете использовать свойство ProjectItem, затем ContainingProject

Найдите файл CustomDictionary.xml или добавьте его, если необходимо

Если у вас есть Project, вы можете использовать project.ProjectItems.Item("CustomDictionary.xml"), чтобы найти его (хотя я думаю, что это может работать только для каталога верхнего уровня), который выдает ArgumentException, если он не существует. Если вам нужно добавить его, вы можете записать файл на диск в папке проекта и использовать project.ProjectItems.AddFromFile(string filename) для его добавления. Вы также можете проверить наличие файла проекта, просто сначала найдя его на диске (создавая или просто записав в него), а затем вызывая AddFromFile в конце, либо только вызывая его, если вы создали файл, либо вызывая его в любом случае и обработка исключения. Когда вы добавили его и закончили его изменение, вы можете получить ProjectItem для этого файла и использовать метод ProjectItem.Save, чтобы сохранить его на диск.

Проверить или добавить в систему контроля версий

Из объекта Project DTE (или любого объекта DTE, на самом деле) вы можете использовать свойство SourceControl, которое позволит вам проверить, находится ли элемент под контролем исходного кода, и проверить его. Тем не менее, я думаю, что у этого есть только возможность «проверить» файл (я думаю, что это tf edit, если вы используете TFS), но нет возможности добавить файл в систему контроля версий. Я не уверен, что лучший способ сделать это программно, извините.

Некоторые ссылки из MSDN:

Элементы объекта верхнего уровня DTE
DTE.Project
Члены DTE.SourceControl

1 голос
/ 06 марта 2010

Получил работу с комбинацией помощи Ноя и кое-что, что я нашел на форумах MSDN. Я не уверен, что было бы лучше получить объект DTE другим способом, но это работает, насколько я вижу:

var bufferAdapter = AdaptersFactory.GetBufferAdapter(textBuffer);
if (bufferAdapter != null)
{
    var persistFileFormat = bufferAdapter as IPersistFileFormat;
    if (persistFileFormat != null)
    {
        string ppzsFilename;
        uint iii;
        persistFileFormat.GetCurFile(out ppzsFilename, out iii);

        var dte2 = (DTE2) Shell.Package.GetGlobalService(typeof (SDTE));

        ProjectItem prjItem = dte2.Solution.FindProjectItem(ppzsFilename);

        var containingProject = prjItem.ContainingProject;

        // Now use the containingProject.Items to find my file, etc, etc
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...