gpt4 book ai didi

visual-studio - Visual Studio 扩展 : Access VS Options from arbitrary DLL

转载 作者:行者123 更新时间:2023-12-04 05:36:03 25 4
gpt4 key购买 nike

我目前正在开发我的第一个 VS 扩展,它需要为用户提供一些选项。正在关注https://msdn.microsoft.com/en-us/library/bb166195.aspx , 很容易想出我自己的选项页面。但是,我还没有找到如何阅读我的选项。

我的扩展的解决方案结构如下:

MySolution
MyProject (generates a DLL from C# code)
MyProjectVSIX

按照上面引用的教程,我向我的 VSIX 项目添加了一个 VS Package 并按照描述对其进行了配置。结果,我的选项页面和我的选项显示在工具/选项下。好的!这是我的 DialogPage 实现:

public class OptionPageGrid : DialogPage
{
private bool myOption = false;

[Category(Options.CATEGORY_NAME)]
[DisplayName("My option")]
[Description("Description of my option.")]
public bool MyOption
{
get { return myOption; }
set { myOption = value; }
}
}

这是我的 Package 类的负责人:

[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [Guid(MyOptionsPage.PackageGuidString)]
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")]
[ProvideOptionPage(typeof(OptionPageGrid), Options.CATEGORY_NAME, Options.PAGE_NAME, 0, 0, true)]
public sealed class MyOptionsPage : Package, IOptions
{
...

但是,我现在想阅读这些选项,并且我想从 MyProject(不依赖于 MyProjectVSIX)进行阅读。这就是我有点迷路的地方。我的第一次尝试是让我的 Package 实现一个 IOptions 接口(interface),并让它通过调用静态方法 Options.Register(IOptions) 来注册自己> 来自 Package 的构造函数。这有效(即 Register() 中的断点被击中),但是当我尝试读取选项时,静态 IOptions 实例仍然为空。我的假设是,这是因为代码是从不同的进程执行的(这超出了我的控制范围)。

经过更多谷歌搜索后,我尝试获取 DTE 对象的实例(如果我理解正确,这将允许我阅读我的选项),但没有成功。我已经尝试了几种变体,包括在 https://msdn.microsoft.com/en-us/library/ee834473.aspx 中描述的那个和

DTE Dte = Package.GetGlobalService(typeof(DTE)) as DTE;

我总是以空引用结束。

最后,由于教程建议通过 Package 的实例访问选项,我试图弄清楚如何通过一些方法获取我的 VS Package 的这样一个实例一种注册表(我可以将其转换为 IOptions),但同样没有运气。

谁能给我指出正确的方向?或者甚至无法从非 VSIX 项目访问 VS 选项?

更新:我做了更多研究,但缺少一条信息:我的扩展是一个单元测试适配器。这似乎暗示测试发现代码和测试执行代码是从不同的进程运行的,也就是说,我的假设是正确的。

与此同时,我设法访问了我正在运行的 VS 实例的 DTE 对象(我会在问题解决后立即将其与我的完整解决方案一起发布),但仍然在访问选项时遇到问题。事实上,以下代码(从此处复制:https://msdn.microsoft.com/en-us/library/ms165641.aspx)运行良好:

Properties txtEdCS = DTEProvider.DTE.get_Properties("TextEditor", "CSharp");
Property prop = null;
string msg = null;
foreach (EnvDTE.Property temp in txtEdCS)
{
prop = temp;
msg += ("PROP NAME: " + prop.Name + " VALUE: " + prop.Value) + "\n";
}
MessageBox.Show(msg);

但是,如果我按如下方式更改上面的内容:

Properties txtEdCS = DTEProvider.DTE.get_Properties(CATEGORY_NAME, PAGE_NAME);

现在代码崩溃了。奇怪的是,我可以在 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0Exp_Config\AutomationProperties\My Test Adapter\General 下的注册表中看到我的属性类别和页面。搜索我的属性显示它们在 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0Exp\ApplicationPrivateSettings\MyProjectVSIX\OptionPageGrid 下(也许是因为我添加了

OptionPageGrid Page = (OptionPageGrid)GetDialogPage(typeof(OptionPageGrid));
Page.SaveSettingsToStorage();

PackageInitialize() 方法(如 Matze 所建议的),可能是因为我之前没有看过那里 :-))。

那么如何读取我的属性呢?

最佳答案

如果你想从你的包中读取选项,你可以通过 VSPackageGetDialogPage 方法请求一个 OptionPageGrid 实例>。例如:

var options = (OptionGridPage)this.package.GetDialogPage(typeof(OptionGridPage));
bool b = options.MyOption;

如果您想从另一个应用程序(或无需 Visual Studio 运行时环境即可使用的程序集)访问这些选项,您可以尝试直接从 Windows 注册表读取这些设置,但注册表项和除非选项已由 IDE 或您的包编写,否则值可能不存在。您可以通过从包中调用 SaveSettingsToStorage 方法强制保留选项,例如在第一次加载时:

options.SaveSettingsToStorage();

设置将存储在以下键下:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\12.0\DialogPage

其中 12.0 表示 Visual Studio 的版本。在这个键下你会发现一堆子键,它们的名字是 DialogPage 组件类型的全名。每个键都包含属性值;在您的情况下,您应该找到一个名为 MyOptionREG_SZ 值,其数据值为 TrueFalse .

关于visual-studio - Visual Studio 扩展 : Access VS Options from arbitrary DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com