是否可以从VS包中编写当前的VS解决方案文件,而无需检测到“文件修改”对话框

时间:2014-09-29 09:13:00

标签: c# .net visual-studio vsix vspackage

从VS包代码中,我想知道是否有一个API来编写当前打开的VS解决方案文件而没有检测到文件修改对话框。

VS File Modification Detected

我需要编写自定义GlobalSection

GlobalSection(MyProduct) = preSolution
    MyData = "XYZ"
EndGlobalSection

我知道IVsDocDataFileChangeControl和关联的sample source code,但似乎解决方案文件对象无法转换为IVsPersistDocDataenter image description here

1 个答案:

答案 0 :(得分:3)

您正在寻找IVsSolutionPersistence服务,您可以将typeof(SVsSolutionPersistence)传递给GetService来获取该服务。我今天晚些时候会尝试查看细节。

  

便于将特定于包的属性和选项写入解决方案文件(.sln),相反,从文件中加载属性和选项。


好的,我终于找到了挖掘IVsSolutionPersistence的时间。使用这个界面的努力程度非常高,所以希望这个答案可以帮助其他人不浪费时间。

基本上,您可以将选项保存在.sln 解决方案文件或.suo 解决方案用户选项文件中。 .sln 解决方案文件适合与使用该解决方案的所有人共享选项,.suo 解决方案用户选项文件适合存储/恢复选项仅在用户本地计算机上。

存储.SUO文件

要通过.suo 解决方案用户选项文件实现存储,您需要使用Package类实现接口IVsPersistSolutionOptsMicrosoft.VisualStudio.Shell.Package类已经实现了此接口,但您需要覆盖包类中的所有四个方法。要获得此示例的示例,您可以参考此Code Project文章的源代码。备注:

  • VS提供的流需要由此项目中定义的StreamEater类包装吗?显然这ComStreamWrapper class也是如此。
  • 保存在.suo文件中时,用户没有收到任何提示对话框要求保存更改。
  • 通过VS实验调试你的软件包时,你会发现.suo文件没有实际写入,我认为VS实验并不想触摸它(只是我的猜测,不确定)。
  • .suo文件存储是专有的二进制存储。您仍然可以通过文本阅读器打开此类文件,并希望以某种方式查看您的键/值数据。

存储.SLN文件

要通过.sln 解决方案文件实现存储,您需要让Package类实现接口IVsPersistSolutionProps。此接口实现IVsPersistSolutionOpts接口,但它不是由类Microsoft.VisualStudio.Shell.Package实现的。我找到的最好的现有实现是在项目VisualGit源代码中。备注:

  • 您需要使用一个或多个ProvideSolutionPropertiesAttribute["YourDataKey"]标记您的包类。如果您不这样做,则不会调用ReadSolutionProps()方法的实现。
  • 您需要通过类Microsoft.VisualStudio.OLE.Interop.IPropertyBagPropertyBag进行读/写访问。您可以选择使用quote或rawData保存数据。 .sln文件中添加的部分如下所示:

      GlobalSection(MY_SECTION_NAME) = preSolution
         MY_DATA = "12:02:45"
      EndGlobalSection
    
  • 在您对方法的ReadSolutionProps()方法的实现中,您必须传递一个VSQUERYSAVESLNPROPS值,该值将向VS指示存储状态。

    < / LI>
  • 当用户关闭解决方案时,将实际写入.sln文件,或者在打开解决方案时关闭VS.系统将提示用户是否要修改.sln文件。如果用户执行Save-All,则不会在Save-All时提示她进行.sln文件修改,也不会在Close Solution时提示。