是否可以在没有“检测到文件修改”对话框的情况下从 VS 包写入当前 VS 解决方案文件

Pat*_*eam 3 .net c# vspackage visual-studio vsix

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

检测到 VS 文件修改

我需要写一个自定义GlobalSection

GlobalSection(MyProduct) = preSolution
    MyData = "XYZ"
EndGlobalSection
Run Code Online (Sandbox Code Playgroud)

我知道IVsDocDataFileChangeControl和关联的示例源代码,但似乎解决方案文件对象无法转换为IVsPersistDocData在此输入图像描述

Sam*_*ell 5

您正在寻找该IVsSolutionPersistence服务,您可以通过访问typeof(SVsSolutionPersistence)来获得该服务GetService。今天晚些时候我将尝试进一步了解详细信息。

有助于将特定于包的属性和选项写入解决方案文件 (.sln),反之亦然,有助于从文件加载属性和选项。


好吧,我终于找到时间深入研究了IVsSolutionPersistence。使用这个界面的工作量非常高,所以希望这个答案能帮助其他一些人不要在这上面浪费时间。

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

存储在.SUO 文件中

要通过.suo 解决方案用户选项文件实现存储,您的 Package 类需要实现接口IVsPersistSolutionOpts。Microsoft.VisualStudio.Shell.Package类已实现此接口,但您需要重写包类中的所有四个方法要获取此示例的实现,您可以参考此代码项目文章的源代码。评论:

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

存储在 .SLN 文件中

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

  • 您需要使用一个或多个ProvideSolutionPropertiesAttribute["YourDataKey"]来标记您的包类。如果你不这样做,你的方法的实现ReadSolutionProps()将不会被调用。
  • 您需要通过类PropertyBag包装对Microsoft.VisualStudio.OLE.Interop.IPropertyBag的读/写访问。您可以选择保存带报价的数据,或仅保存原始数据。文件中添加的部分将如下所示:.sln

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

  • .sln当用户关闭解决方案或在打开解决方案的情况下关闭 VS 时,将实际写入该文件。如果用户想要修改该.sln文件,系统将提示她。如果用户执行“全部保存”,则在“全部保存”时和“关闭解决方案”时都不会提示她修改 .sln 文件。