【发布时间】:2015-08-24 09:00:45
【问题描述】:
我目前正在开发我的第一个 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; }
}
}
这是我的包类的负责人:
[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 接口,并通过从Package 的构造函数调用静态方法Options.Register(IOptions) 让它自己注册。这有效(即,Register() 中的断点被命中),但是当我尝试读取选项时,静态 IOptions 实例仍然为空。我的假设是这是因为代码是从不同的进程执行的(这超出了我的控制范围)。
在谷歌搜索后,我尝试获取DTE 对象的实例(如果我理解正确,这将允许我阅读我的选项),但没有成功。我尝试了几种变体,包括https://msdn.microsoft.com/en-us/library/ee834473.aspx 和
DTE Dte = Package.GetGlobalService(typeof(DTE)) as DTE;
我总是得到一个空引用。
最后,由于教程建议通过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();
到Package 的Initialize() 方法(正如 Matze 建议的那样),可能是因为我以前没有看过那里:-))。
那么如何读取我的属性呢?
【问题讨论】:
标签: visual-studio visual-studio-extensions vsix envdte vspackage