在VSIX编辑器语言扩展组件之间共享状态

时间:2016-07-01 14:53:38

标签: c# visual-studio visual-studio-2015 visual-studio-extensions vsix

我已经创建了ClassifierErrorTaggerSignatureHelpTextCompletion个类。这些都是由VS发现的MEF组件提供商创建的。

问题是,我想在这些组件之间共享一个C#对象来共享状态,并允许我保存从每个组件重新分析相同的文本。我怎样才能做到这一点?我需要这个状态来编辑每个文件。

VS发现提供程序并使用它们创建我的组件。但是,我如何在他们之间传递或分享状态?我确实使用了全局单例,但是当我在VS中编辑了多个文件时,它们都共享相同的单例,但是我需要为每个正在编辑的文件设置不同的实例。

1 个答案:

答案 0 :(得分:1)

一种常见的方法是ITextViewITextBuffer都有一个Properties属性,你可以将它作为一个通用的包放入其中。甚至还有一个GetOrCreateSignletonProperty助手。通常有某种组件可以监视ITextBuffer进行更改并以这种方式进行解析,而每个其他组件只是抓取每个文本缓冲区对象。

分类器和标记器也可以实现IDisposableITextViews有一个close事件,所以也可以在ITextBuffer / ITextView之间的某个地方设置一个静态字典你自己的类型和管理生命周期。

你要么这样做 - 测试!很容易意外搞砸和泄漏ITextBufferITextView