1

我创建了Classifier,ErrorTagger,SignatureHelpTextCompletion类。这些都是由VS发现的MEF组件供应商创建的。在VSIX Editor语言扩展组件之间共享状态

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

VS发现提供程序并使用它们创建我的组件。但是,我怎么能通过或分享他们之间的状态?我确实使用了一个全局单例,但是当我在VS中编辑多个文件时,它们都共享同一个单例,但是我需要为每个正在编辑的文件另外创建一个实例。

+0

'IServiceProvider'应该做的。但是,如果所有的东西都运行在新的VS的同一个AppDomain中,那么静态变量也应该可以工作。 – leppie

回答

1

一个常见的方法是ITextViewITextBuffer都有一个属性属性,你可以用它作为一个通用的袋子来放入东西。甚至还有一个GetOrCreateSignletonProperty帮助器。通常有某种类型的组件会监视ITextBuffer的变化并以这种方式进行解析,而每个其他组件只是抓取这个每个文本缓冲区对象。

量词和标注器也可以实现IDisposable,并ITextViews有着密切的事件,所以它也有可能只需要从ITextBuffer/ITextView某处的静态字典自己的类型和管理生命周期的方式。

无论哪种方式你做 - 测试!意外拧紧和泄漏ITextBufferITextView非常容易。