2012-01-08 60 views
2

在Package构造函数中,我添加了OnStartupComplete事件的事件处理函数。但是当我运行代码时,事件处理程序不会被调用。我究竟做错了什么?DTEEvents.OnStartupComplete事件不适用于VSPackage(VSSDK2010)

+0

默认情况下,包延迟加载。你是否告诉Visual Studio在启动时加载你的包?看到这个问题的答案:http://stackoverflow.com/questions/7815461/vsix-execute-code-on-vs-startup – Will 2012-01-09 15:56:35

+0

请问,我使用PackageAutoload属性,但这个属性只适用于VS是由一个项目或解决方案文件。如果我只打开VS来打开StartPage,那么这个包不会被加载! – dattebayo 2012-01-12 01:58:33

+0

我不相信这是真的。还有其他一些属性可以放在你的包上,它告诉VS你的包只有在解决方案出现时才应该加载。你确定你没有使用其中之一? – Will 2012-01-12 14:12:27

回答

0

尝试将代码从包构造函数移动到包的Initialize()方法。它应该有所帮助,但如果没有,请测试其他UICONTEXT _ ???您的AutoLoad属性值可能为UICONTEXT_NoSolution

3

VS中存在一个错误,它会回收DTEEvents对象(使用您的事件处理程序),除非您明确引用该对象。你需要的东西是这样的:

[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)] 
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)] 
class MyPackage : Package 
{ 
    DTEEvents _EventsObj; 

    protected override void Initialize() 
    { 
     var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE)); 
     _EventsObj = dte.Events.DTEEvents; 
     _EventsObj.OnStartupComplete += OnStartupComplete; 
    } 

    void OnStartupComplete() 
    { 
    } 
} 
+0

非常好,完全正确。谢谢! – Kram 2014-10-14 14:15:09

0

见我的答案在这里:http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/eb1e8fd1-32ad-498c-98e9-25ee3da71004

我认为,那是因为你可能是拳击和做的事件订阅之前拆箱您DTE对象。这是一个巨大的麻烦,并且令人惊讶的是DTE对象无法通过服务位置轻松传递以用于事件订阅;但这似乎是罪魁祸首。

我曾尝试保留对DTE对象的引用,但无论如何我没有做出任何改变。有些事件会起作用,有些则不会;但这是一致的。