我的Visual Studio程序包要求使用EnvDTE.DTE变量,但它始终以null返回。在阅读了许多技巧之后,所有人都说要使用OnShellPropertyChange()方法(IVsShellPropertyEvents),但是有时它永远不会触发-好像我的扩展程序永远不会完成加载。

我正在使用VS2010,并同时检查VSSPROPID_Zombie和ShellInitialized-无效。 :(

有任何想法吗?这是我正在使用的代码:

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,它就不会触发。

最佳答案

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

  • 您确实应该使用__VSSPROPID4.VSSPROPID_ShellInitialized(在Microsoft.VisualStudio.Shell.Interop.10.0中定义),而不是使用-9083来提高可读性
  • 您应该检查是否将ShellInitialized设置为 true (尽管检查Zombie设置为false是正确的)
  • 请记住,在VS启动时,一旦 ...,ShellInitialized将更改为true 。如果您的软件包已注册为在启动时自动加载(在VS完全准备就绪之前可能会发生),则检查是否是正确的方法。但是,大多数软件包在启动时应而不是自动加载,而应根据需要您的软件包代码的某些用户操作按需加载。然后,您可以在包类Initialize方法中检查DTE服务。
  • 10-04 12:03