首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VSIX:获取DTE对象

VSIX:获取DTE对象
EN

Stack Overflow用户
提问于 2010-09-25 11:14:36
回答 3查看 9.9K关注 0票数 9

我的Visual Studio包需要使用EnvDTE.DTE变量,但它总是返回空值。在阅读了许多技巧之后,所有这些技巧都建议使用OnShellPropertyChange()方法(IVsShellPropertyEvents),但有时它永远不会触发-就好像我的扩展永远不会完成加载一样。

我正在使用VS2010,并同时检查VSSPROPID_Zombie和ShellInitialized --没有工作。:(

有什么想法吗?这是我使用的代码:

代码语言:javascript
复制
public int OnShellPropertyChange(int propid, object var) {
            if (propid == -9053 || (int) __VSSPROPID.VSSPROPID_Zombie == propid) { // -9053 = ShellInit
                try {
                    if ((bool) var == false) {
                        Dte = GetService(typeof (SDTE)) as DTE;
                        Flow.Dte = Dte;

                        var shellService = GetService(typeof (SVsShell)) as IVsShell;

                        if (shellService != null)
                            ErrorHandler.ThrowOnFailure(shellService.UnadviseShellPropertyChanges(_cookie));

                        _cookie = 0;
                    }
                } catch {

                }
            }

            return VSConstants.S_OK;
        }

编辑:在实验实例下,工作正常,初始化时间约为5秒。然而,一旦部署为VSIX,它就不会触发。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-26 01:22:10

我在这里看到了几个问题:

  • 你真的应该使用__VSSPROPID4.VSSPROPID_ShellInitialized (在Microsoft.VisualStudio.Shell.Interop.10.0中定义),而不是-9083对于readability
  • You应该检查ShellInitialized是否设置为(尽管检查僵尸是否为假是正确的)
  • 请记住,一旦启动VS的...on,ShellInitialized将更改为真。如果您的包注册为在启动时自动加载(这可能发生在VS完全准备就绪之前),那么检查它是正确的方法。然而,大多数包不应该在启动时自动加载(---),而应该从一些需要包代码的用户操作中按需加载。然后,您可以在包类Initialize方法中检查DTE服务。
票数 5
EN

Stack Overflow用户

发布于 2012-03-16 17:37:01

尝试执行以下命令:

代码语言:javascript
复制
dte = Package.GetGlobalService(typeof(DTE)) as DTE2;
票数 31
EN

Stack Overflow用户

发布于 2010-09-25 13:15:58

如果您有一个MEF组件,那么访问DTE对象的最简单方法如下所示

首先添加一个对Microsoft.VisualStudio.Shell.Immutable.10的引用。然后为SVsServiceProvider添加一个MEF导入。此对象有一个可以查询DTE的GetService方法

代码语言:javascript
复制
[ImportingConstructor]
public MyComponent(SVsServiceProvider serviceProvider) {
  _DTE dte = (_DTE)serviceProvider.GetService(typeof(_DTE));
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3792333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档