从VS软件包代码中,我想知道是否有一个API可以在没有“检测到文件修改”对话框的情况下编写当前打开的VS解决方案文件。



我需要编写一个自定义GlobalSection

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


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

最佳答案

您正在寻找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.IPropertyBag包装对PropertyBag的读/写访问。您可以选择保存带引号的数据,或仅保存rawData的数据。 .sln文件中添加的部分如下所示:

  GlobalSection(MY_SECTION_NAME) = preSolution
     MY_DATA = "12:02:45"
  EndGlobalSection

在方法的方法ReadSolutionProps()的实现中,必须传递VSQUERYSAVESLNPROPS值,该值将指示VS的存储状态。
当用户关闭解决方案或在打开解决方案的情况下关闭VS时,实际上将写入.sln文件。如果要修改.sln文件,将提示用户。如果用户执行“全部保存”,则不会在“全部保存”时间或“关闭解决方案”时间不提示她修改.sln文件。

09-11 03:34
查看更多