2011-01-27 52 views
0

我试图挂钩几个Visual Studio事件。不幸的是我在第一步失败了。事件处理程序永远不会被调用。Visual Studio 2010扩展 - 未调用的事件

所以我的问题是我做错了什么?

这里是我的代码的一小段摘录。

// here are some attributes 
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)] 
public sealed class VSPackage : Package { 
    EnvDTE80.DTE2 dte_; 
    EnvDTE.DocumentEvents documentEvents_; 
    EnvDTE.WindowEvents windowEvents_; 

    public VSPackage2Package() { 
    Trace.WriteLine("I am get called."); 
    } 

    protected override void Initialize() { 
    Trace.WriteLine("I am get called too."); 

    dte_ = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal. 
     GetActiveObject("VisualStudio.DTE.10.0"); 

    windowEvents_ = dte_.Events.WindowEvents; 
    documentEvents_ = dte_.Events.DocumentEvents; 

    windowEvents_.WindowCreated += 
     new EnvDTE._dispWindowEvents_WindowCreatedEventHandler(
     windowEvents_WindowCreated); 

    documentEvents_.DocumentOpened += 
     new EnvDTE._dispDocumentEvents_DocumentOpenedEventHandler(
     documentEvents__DocumentOpened); 

    Trace.WriteLine("Everything fine until here."); 
    } 

    void documentEvents__DocumentOpened(EnvDTE.Document document) { 
    Trace.WriteLine("Never called"); 
    } 

    void windowEvents_WindowCreated(EnvDTE.Window window) { 
    Trace.WriteLine("Never called"); 
    } 
} 

编辑:

我得到它的工作,寻找其他的示例代码,我想通了,他们有时会获得DTE对象不同。更改

dte_ = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal. 
     GetActiveObject("VisualStudio.DTE.10.0"); 

dte_ = GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2; 

,现在一切都很好。

回答

0

它应该工作。

我敢肯定,如果你从一个Addin做同样的工作。软件包有时可能是痛苦的。

事实上,当一个包被加载时,shell(DTE)可能还没有完全加载。尝试注册您的活动。

为此,请使用OnShellPropertyChange事件和僵尸状态来知道何时注册。 http://social.msdn.microsoft.com/forums/en-US/vsx/thread/3097a0e1-68e3-47ea-a4ba-8511571b2487/

阅读以下内容,我认为它会回答你的问题。注:The GetService method is the same as calling GetGlobalService

1 ServiceProvider.GlobalProvider

在 的ServiceProvider类这种新的静态属性可以访问 从任何 代码的全球服务提供商,只要它是从 主UI叫线。此属性为 与 Package.GetGlobalService静态方法 密切相关,该方法在先前的 版本的MPF中可用。与 Package.GetGlobalService的问题是,如果包尚未初始化 ,则 会失败。这导致微妙的 订购使用 MPF库的代码中的错误,而不初始化它们自己的 包。有时他们 只能工作,因为另一个 包已经初始化代表他们的 全球服务提供商 。如果其他程序包已卸载,或者已移除 或可能已移至 不同版本的MPF,则该 static将不再被初始化 导致Package.GetGlobalService至 失败。

现在,在MPF 10,你可以只要拨打任何 时间 ServiceProvider.GlobalProvider因为你是从 UI线程调用。出于兼容性考虑,这个 机制仍然会使用由第一 包创建的 的ServiceProvider进行选址,但在情况 在没有包装至今还没有 初始化,MPF 10.0现在有 能力,从获得的全球供应商 已注册的COM消息 过滤器。 Package.GetGlobalService()是 也连接到这个新的机制。

+0

没有帮助,OnShellPropertyChange叫,但从来没有与那里提到,移动我的事件注册反正有没有物业成功地执行,而且事件不叫 – ConfusedSushi 2011-01-27 13:55:11

相关问题