- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发我的第一个 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();
到 Package
的 Initialize()
方法(如 Matze 所建议的),可能是因为我之前没有看过那里 :-))。
那么如何读取我的属性呢?
最佳答案
如果你想从你的包中读取选项,你可以通过 VSPackage
的 GetDialogPage
方法请求一个 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
组件类型的全名。每个键都包含属性值;在您的情况下,您应该找到一个名为 MyOption
的 REG_SZ
值,其数据值为 True
或 False
.
关于visual-studio - Visual Studio 扩展 : Access VS Options from arbitrary DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178255/
我正在尝试编写 Access Access 数据库的脚本,以便在命令行上使用。 Access 数据库使用工作组文件进行保护。 Dim oApp, sWGF,myWS Set sApp = Create
我有一个包含数据表的表格。我希望用户能够选择多行,单击按钮并运行一些 sql 查询并对这些行执行一些工作。 查看我的 VBA 代码,我发现如何使用 CurrentRecord 属性 Access 最后
如果我在某个网络位置有 Microsoft Access 2007 数据库,那么可以使用该数据库的客户端计算机的数量是否有限制?客户端不会安装 Access,而是使用 Access Runtime 2
我正在开发一个注册系统。但我收到此错误:You tried to execute a query that does not include the specified expression.. 我正
我有一个产品设计为使用 MS Access 文件作为数据库的桌面产品。 现在,一些用户需要将它安装在几台 PC(比如说 2 或 3 台)上并共享数据库。 我想将 MS Access 文件放在共享文件夹
我接手了一个旧的软件项目,该项目使用 MS Access 数据库来存储数据。但是数据库不会在 Access 中打开,如下所示: "You do not have the necessary permi
我有一个文件夹,里面装满了 100 多个 Access97 文件。我需要将它们全部更新到 Access2003。 我可以手动完成,但使用 VBA 可能会快很多。 有没有人会有一个片段可以做到这一点?或
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我的公司用 Visual Basic 6 开发了一个应用程序。 该应用程序通过 ODBC 数据源使用 Access 数据库。 Access 数据库是一个扩展名为“.mdb”的文件。 在以下环境中运行应
我一直在尝试让 Microsoft Access 从主 Access 窗口中“退出”,以便我可以隐藏 Access 窗口并仅在桌面上显示表单,以便可以轻松地将其放置在其他应用程序旁边。 起初我发现了一
我想在 access 2010 中使用 access 2000 和 2003 数据库。由于我不想检查一切是否手动工作,我正在寻找一种工具来分析 VBA 代码以查找使用 access 2010 发生的错
所以我有一个 Excel 工作簿,其中有一个很好的 shaperange 对象的全局 map 。通过一些非常简单的代码,我可以更改颜色、将国家/地区集合分组和取消分组为数组等......并且效果非常好
我们希望有大约 35-40 人通过共享驱动器上的脚本写入 Access 数据库。这些指标分解为他们需要每小时写大约 3-7 次。 Access 会支持这一点而不会对我产生影响吗? 是的,我很乐意将其用
我正在寻找一种使用 VBA 代码从外部数据库文件中删除 VBA 模块的方法。名为“myfile.accdb”的外部文件有一个名为“mod1”的模块,我希望能够在单独的项目中使用 VBA 代码删除该模块
我在 Access 2003 数据库(在 Access 2007 中开发)中有三个表单,它们处于父级 -> 子级 -> 孙子级关系中。在子窗体的 'Form_Load' 子窗体中,我设置了孙子窗体的一
MS Access 2007 存在拒绝在设计模式下显示表单的问题。我可以看到表单的代码(如果我查看显示表单的按钮的事件属性),但我看不到作为 GUI 布局的表单。而且,当我尝试从应用程序的主窗口调用此
我编写了代码,使用 Excel 中的下拉列表提供的标准将两个表连接起来,然后将数据返回到电子表格上的特定位置(工作表上已经有标题)。 这在我的机器上和其他机器上使用 MS Access 的机器上都可以
我正在开始构建一个应用程序,该应用程序从给定的根路径开始遍历文件夹结构,并将所有找到的 Access 1997 .mdb 文件转换为较新的 Access 2007/2010 .accdb 格式。但是,
我有一个表单和一个按钮。我想通过单击按钮打开另一个表单,并将参数从父表单传递到子表单(子表单的 RecordSource 有参数)。我该怎么做? 最佳答案 您可以通过引用表单的对象来引用调用表单的任何
我是一名优秀的程序员,十分优秀!