Как мне отредактировать файл .cs в проекте надстройки с помощью DTE - PullRequest
3 голосов
/ 31 марта 2011

Я пытаюсь написать свою первую надстройку для vs2010, но я изо всех сил.

У меня есть сборка, которая генерирует много файлов CS. Я хочу, чтобы мой плагин добавил новые файлы в выбранный проект или, если они существуют, перезапишите их.

У меня 2 проблемы:

  1. Когда я добавляю новый файл, как мне добавить его в подпапку внутри проекта? Кажется, я могу добавить только в корень проекта.
  2. Если файл cs существует, как мне очистить его содержимое? Я использую интерфейсы EnvDTE.TextDocument и EnvDTE.EditPoint. Но каждый раз, когда я пытаюсь перебрать строки очистки документа, я получаю сообщение об ошибке COM «Исключение из HRESULT: 0x80041001».

    Я не хочу удалять файл и добавлять новый файл, если смогу помочь. Из-за входа в систему контроля версий.

Ответы [ 2 ]

6 голосов
/ 28 октября 2011
textDoc = (TextDocument) document.Object("TextDocument");
EditPoint editPoint = (EditPoint)textDoc.StartPoint.CreateEditPoint();
EditPoint endPoint = (EditPoint)textDoc.EndPoint.CreateEditPoint();
editPoint.Delete(endPoint);

Зацикливание не требуется, и точка редактирования никогда не перемещается с первой позиции.

3 голосов
/ 31 марта 2011

Ну, у меня есть один способ сделать это.

 
// Get an instance of the currently running Visual Studio IDE.
var dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");

//I store the list of projects in dte2.Solution.Projects in a combobox

EnvDTE.Project project = (EnvDTE.Project)projectList.SelectedValue; //I get my projects out of a combobox

foreach (ProjectItem projectItem in project.ProjectItems)
{
    Document document;
    try
    {
        projectItem.Open();
        document = projectItem.Document;
    }
    catch(Exception)
    {
        Console.WriteLine("failed to load document");
        continue;
    }
    if (document == null)
    {
        continue;
    } 

    if (document.Name == "Class1.cs") //whatever file your after
    {
        TextDocument editDoc = (TextDocument) document.Object("TextDocument");
        EditPoint objEditPt = editDoc.CreateEditPoint();
        objEditPt.StartOfDocument();
        document.ReadOnly = false;

        while (!objEditPt.AtEndOfDocument)
        {           
            objEditPt.Delete(objEditPt.LineLength); 
            objEditPt.LineDown(1);
        }

        objEditPt.DeleteWhitespace(vsWhitespaceOptions.vsWhitespaceOptionsHorizontal);
        objEditPt.DeleteWhitespace(vsWhitespaceOptions.vsWhitespaceOptionsVertical);

        Console.WriteLine("saving file {0}", document.FullName);
        document.Save(document.FullName);   
    }
}
...