Visual Studio 2010:如何从编辑器扩展中创建和/或更新项目中的特定文件?

时间:2010-03-02 21:04:30

标签: c# visual-studio-2010

我正在努力扩展最近在代码库中更新的拼写检查器:http://code.msdn.microsoft.com/spellCheckerSample

我想更新它,以便“忽略”单词列表来自 CustomDictionary.xml ,这是静态代码分析工具使用的相同文件。

在我的VS 2010编辑器扩展程序中,我需要:

  1. 找到当前文件所在的项目。
  2. 找到“CustomDictionary.XML”文件(如果存在)。
  3. 如果存在,我需要从源代码管理中查看
  4. 如果它不存在,我需要将它添加到当前项目(和源代码管理)
  5. 将文本添加到CustomDictionary.XML文件中(这是一个简单的部分)。
  6. 是否有人知道任何可以帮助我学习如何操作的示例?我正在使用VS2010 Release Candidate。

    感谢。

    ~Cameron

    这是我到目前为止所拥有的:

    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 个答案:

答案 0 :(得分:3)

首先,最好根据我发布的拼写检查样本的更新版本扩展;你可以grab the source on github

查找给定缓冲区的项目

假设您从ITextBuffer开始,您可以通过以下方式进入DTE Project

  1. 在你拥有的任何MEF组件中(对于拼写检查,SpellingDictionaryService是最佳位置),添加以下MEF导入:

    [Import] 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
  6. 查找CustomDictionary.xml文件或在必要时添加

    获得Project之后,您可以使用project.ProjectItems.Item("CustomDictionary.xml")来查找它(虽然我认为这可能仅适用于顶级目录),如果它出现ArgumentException不存在。如果需要添加它,则可以将文件写入项目位置的磁盘并使用project.ProjectItems.AddFromFile(string filename)添加它。您还可以通过先在磁盘上查找(创建或只是写入)来检查项目文件是否存在,然后在最后调用AddFromFile,或者只在您创建文件时调用它或者无论如何都要调用它。处理异常。添加完并完成修改后,您可以获取该文件的ProjectItem并使用ProjectItem.Save方法将其保存到磁盘。

    签出或添加到源代码管理

    Project DTE对象(实际上是任何DTE对象),您可以使用SourceControl属性,它可以让您检查项目是否受源代码管理并检查出来。但是,我认为这只能让你“检出”一个文件(我认为如果你使用的是TFS,我会做tf edit),而不能将文件添加到源代码控制中。我不确定以编程方式执行此操作的最佳方法,抱歉。

    来自MSDN的一些参考文献:

    Top-level DTE object members
    DTE.Project members
    DTE.SourceControl members

答案 1 :(得分:1)

使用诺亚的帮助和我在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
    }
}