【问题标题】:Share state between VSIX Editor Language Extension components在 VSIX 编辑器语言扩展组件之间共享状态
【发布时间】:2016-07-02 02:04:31
【问题描述】:

我创建了ClassifierErrorTaggerSignatureHelpTextCompletion 类。都是由提供者创建的,它们是 VS 发现的 MEF 组件。

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

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

【问题讨论】:

  • IServiceProvider 应该可以解决问题。但是考虑到所有东西都在同一个应用程序域中与较新的 VS 一起运行,静态变量也应该可以工作......

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


【解决方案1】:

一种常见的方法是ITextViewITextBuffer 都有一个Properties 属性,您可以将其用作一个通用包来放置东西。它甚至还有一个GetOrCreateSignletonProperty 助手。通常有某种组件会监视 ITextBuffer 的变化并以这种方式进行解析,而每个其他组件只是抓取这个 per-text-buffer 对象。

分类器和标记器也可以实现IDisposable,并且ITextViews 有一个关闭事件,所以也可以在ITextBuffer/ITextView 的某个地方有一个静态字典到您自己的类型并以这种方式管理生命周期.

无论你怎么做——测试! ITextBufferITextView 很容易不小心搞砸并泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2019-02-18
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多