我正在努力扩展最近在代码库中更新的拼写检查器:http://code.msdn.microsoft.com/spellCheckerSample
我想更新它,以便“忽略”单词列表来自 CustomDictionary.xml ,这是静态代码分析工具使用的相同文件。
在我的VS 2010编辑器扩展程序中,我需要:
是否有人知道任何可以帮助我学习如何操作的示例?我正在使用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.
}
}
}
答案 0 :(得分:3)
首先,最好根据我发布的拼写检查样本的更新版本扩展;你可以grab the source on github。
假设您从ITextBuffer
开始,您可以通过以下方式进入DTE Project
:
在你拥有的任何MEF组件中(对于拼写检查,SpellingDictionaryService
是最佳位置),添加以下MEF导入:
[Import] IVsEditorAdaptersFactoryService AdaptersFactory = null;
此外,如果项目已经存在,请将Microsoft.VisualStudio.Editor.dll
的引用添加到项目中。
ISpellingDictionaryService
上的方法也可以使用ITextBuffer
,或修改服务以返回特定于缓冲区/项目的拼写字典实例(然后方法不会需要有一个明确传递给每个调用)。AdaptersFactory.GetBufferAdapter
获取VS缓冲区适配器(IVsTextBuffer
)。IExtensibleObject
,并致电IExtensibleObject.GetAutomationObject("Document")
以获取缓冲区的DTE Document
。ProjectItem
属性,然后使用ContainingProject
获得Project
之后,您可以使用project.ProjectItems.Item("CustomDictionary.xml")
来查找它(虽然我认为这可能仅适用于顶级目录),如果它出现ArgumentException
不存在。如果需要添加它,则可以将文件写入项目位置的磁盘并使用project.ProjectItems.AddFromFile(string filename)
添加它。您还可以通过先在磁盘上查找(创建或只是写入)来检查项目文件是否存在,然后在最后调用AddFromFile,或者只在您创建文件时调用它或者无论如何都要调用它。处理异常。添加完并完成修改后,您可以获取该文件的ProjectItem
并使用ProjectItem.Save
方法将其保存到磁盘。
从Project
DTE对象(实际上是任何DTE对象),您可以使用SourceControl
属性,它可以让您检查项目是否受源代码管理并检查出来。但是,我认为这只能让你“检出”一个文件(我认为如果你使用的是TFS,我会做tf edit
),而不能将文件添加到源代码控制中。我不确定以编程方式执行此操作的最佳方法,抱歉。
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
}
}