【问题标题】:Static data in Visual Studio extensionVisual Studio 扩展中的静态数据
【发布时间】:2013-10-01 04:35:40
【问题描述】:

我有一个 Visual Studio 扩展,其中大部分功能都是通过 MEF 编写的。到目前为止,我的个人功能是每个 ITextBuffer,所以我使用了 Properties 成员来缓存实例。

但是,现在我有一些需要针对每个项目和每个解决方案的功能。 EnvDTE 类提供了一个 Properties 对象,但我不知道它们是否可以存储我自己的任意数据。我真的不想让自己的数据静态化。

如何在不使用全局变量的情况下存储每个项目和每个解决方案的数据?

编辑:

我还可能会提到,由于您不能将 MEF 导入用于静态数据,即使您将其隐藏在单例中,那么使用全局变量路由在物理上也是不可能的。所以我真的,真的需要一些不是全球性的东西。

编辑:

我说的是对象引用,而不是持久值。我不需要在解决方案或项目文件中存储任何内容,只需使用对象即可。

【问题讨论】:

  • 你能举一些例子/截图吗?我对 MEF 不是很熟悉,这可能就是您的问题对我来说不清楚的原因。
  • @Neolisk:你想要什么截图,MEF 的文档说你不能导入静态成员?或者没有用户可用存储空间的 EnvDTE.Solution/EnvDTE.Project 的文档?
  • 无意冒犯,我只是想增加这个问题被回答的机会,如果不是我,其他人会。您提供的信息越多越好。你不想白白烧掉你的赏金,对吧?是的,指向文档相关部分的链接会有所帮助。
  • 您是否正在为每个解决方案寻找 IVsSolutionPersistence?对于每个项目,大多数项目系统层次结构(不是全部)都实现 IVsBuildPropertyStorage。
  • @SimonMourier:不,我正在处理非持久性数据。抱歉,这不是很清楚。

标签: visual-studio-2012 mef visual-studio-extensions envdte


【解决方案1】:

我找到了一种方法来说服 MEF 尊重我的静态导入,所以现在,我只使用一些静态数据。

(Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel)) as IComponentModel).DefaultCompositionService.SatisfyImportsOnce(this);

它是在其他地方发布的——甚至可能是在 SO 上——不过我花了一段时间才找到它。请注意,this 不需要接口 - 使用反射,因此它应该对 any this 有效。

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,您可以创建一个用于导出的存根类,而不是试图强制您的静态类导出。

    public class HostClass
    {
       public static string StaticString
       { get  { return "string value"; } }
    }
    
    public class HostClassStub
    {
       [Export("StaticStringValue", typeof(string))]
       public string StaticString
       { get { return HostClass.StaticString; } }
    }
    

    如果您愿意,您也可以考虑将静态类设为非静态类。请记住,默认情况下 MEF 导入是单例的,因此它应该就像为每个执行导入的项目拥有一组全局变量一样。

    我知道这不能解决您的问题的 VS 扩展方面,但我还没有处理这些问题。不过,也许这会给您提供解决方案的途径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多