SettingsManager.GetWritableSettingsStore可用于Visual Studio扩展中的导入/导出?

Ran*_*ngy 11 c# visual-studio-extensions visual-studio-2017

我正在使用SettingsManager我的Visual Studio扩展来存储用户设置.

SettingsManager settingsManager = new ShellSettingsManager(ServiceProvider.GlobalProvider);
var store = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings);
Run Code Online (Sandbox Code Playgroud)

我有一个自定义的WPF选项页面,如本文所述.我还想将我的扩展设置为使用导入/导出设置,因此我按照创建选项页面创建设置类别页面,将其添加到我的包属性:

[ProvideProfile(typeof(OptionsDialogPage), "Unit Test Boilerplate Generator", "Unit Test Boilerplate Generator Settings", 106, 107, true, DescriptionResourceID = 108)]
[ProvideOptionPage(typeof(OptionsDialogPage), "Unit Test Boilerplate Generator", "Templates", 101, 109, supportsAutomation: true)]
Run Code Online (Sandbox Code Playgroud)

我成功地将其显示为导入/导出设置下的标题,但导出后我的数据都没有存储SettingsManager.我一直在寻找在下方的选项ProvideProfile,并ProvideOptionPage和尝试设置SupportsProfiles = true,但没有帮助.

如何挂钩这两个系统?

(编辑)我运行了Process Monitor,在这里找到了SettingsManager键(CollectionPath UnitTestBoilerplateGenerator):

\REGISTRY\A\{08894cfc-f3a9-f49b-133e-3453dfe7a27d}\Software\Microsoft\VisualStudio\15.0_a703f143Exp\UnitTestBoilerplateGenerator\Template_VisualStudio_Moq_File
Run Code Online (Sandbox Code Playgroud)

此处存储的内置选项(来自另一个扩展的示例):

\REGISTRY\A\{22e40365-b8e3-e9b2-1315-55021a1e4c3d}\Software\Microsoft\VisualStudio\15.0_a703f143\ApplicationPrivateSettings\Xavalon\XamlStyler\Core\Options\StylerOptions\NoNewLineElement
Run Code Online (Sandbox Code Playgroud)

所以它们似乎存储在不同的区域.有没有办法以编程方式编写这些内置选项或在导入/导出中包含自定义CollectionPath?

Ran*_*ngy 0

我找到了一种方法来做到这一点。您需要写入与选项对话框类型的完整类型名称相对应的集合路径。我的是UnitTestBoilerplate.View.OptionsDialogPage,所以我使用了ApplicationPrivateSettings\UnitTestBoilerplate\View\OptionsDialogPage. 我还需要在选项对话框类型上创建一个虚拟属性,以欺骗 VS 实际导出设置。所以如果我写信给MyProperty我需要

public int MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

在选项对话框页面上。

然而,这似乎是一个巨大的 hack,可能会在新版本的 VS 上崩溃。如果有人有的话,我希望有一个更优雅的解决方案。

另外一个非常奇怪的警告是,如果字符串设置的键名称中有“VisualStudio”,则无论您在其中添加什么,它都会返回为“1*null*”。