从VS包代码中,我想知道是否有一个API来编写当前打开的VS解决方案文件而没有检测到文件修改对话框。
我需要编写自定义GlobalSection
:
GlobalSection(MyProduct) = preSolution
MyData = "XYZ"
EndGlobalSection
我知道IVsDocDataFileChangeControl和关联的sample source code,但似乎解决方案文件对象无法转换为IVsPersistDocData。
答案 0 :(得分:3)
您正在寻找IVsSolutionPersistence
服务,您可以将typeof(SVsSolutionPersistence)
传递给GetService
来获取该服务。我今天晚些时候会尝试查看细节。
便于将特定于包的属性和选项写入解决方案文件(.sln),相反,从文件中加载属性和选项。
好的,我终于找到了挖掘IVsSolutionPersistence
的时间。使用这个界面的努力程度非常高,所以希望这个答案可以帮助其他人不浪费时间。
基本上,您可以将选项保存在.sln
解决方案文件或.suo
解决方案用户选项文件中。 .sln
解决方案文件适合与使用该解决方案的所有人共享选项,.suo
解决方案用户选项文件适合存储/恢复选项仅在用户本地计算机上。
存储.SUO文件
要通过.suo
解决方案用户选项文件实现存储,您需要使用Package类实现接口IVsPersistSolutionOpts。 Microsoft.VisualStudio.Shell.Package类已经实现了此接口,但您需要覆盖包类中的所有四个方法。要获得此示例的示例,您可以参考此Code Project文章的源代码。备注:
.suo
文件中时,用户没有收到任何提示对话框要求保存更改。.suo
文件没有实际写入,我认为VS实验并不想触摸它(只是我的猜测,不确定)。.suo
文件存储是专有的二进制存储。您仍然可以通过文本阅读器打开此类文件,并希望以某种方式查看您的键/值数据。存储.SLN文件
要通过.sln
解决方案文件实现存储,您需要让Package类实现接口IVsPersistSolutionProps。此接口实现IVsPersistSolutionOpts接口,但它不是由类Microsoft.VisualStudio.Shell.Package实现的。我找到的最好的现有实现是在项目VisualGit源代码中。备注:
ReadSolutionProps()
方法的实现。您需要通过类Microsoft.VisualStudio.OLE.Interop.IPropertyBag对PropertyBag进行读/写访问。您可以选择使用quote或rawData保存数据。 .sln
文件中添加的部分如下所示:
GlobalSection(MY_SECTION_NAME) = preSolution
MY_DATA = "12:02:45"
EndGlobalSection
在您对方法的ReadSolutionProps()
方法的实现中,您必须传递一个VSQUERYSAVESLNPROPS值,该值将向VS指示存储状态。
.sln
文件,或者在打开解决方案时关闭VS.系统将提示用户是否要修改.sln
文件。如果用户执行Save-All,则不会在Save-All时提示她进行.sln文件修改,也不会在Close Solution时提示。