2

在 Package 构造函数中,我为 OnStartupComplete 事件添加了事件处理程序。但是当我运行代码时,不会调用事件处理程序。我究竟做错了什么?

4

3 回答 3

4

DTEEvents除非您保留对它的显式引用,否则VS 中有一个错误会回收对象(使用您的事件处理程序)。你需要这样的东西:

[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()
    {
    }
}
于 2012-11-30T11:17:18.297 回答
0

尝试将代码从包构造函数移动到包的 Initialize() 方法。它应该有帮助,但如果没有,请测试其他一些 UICONTEXT_??? 您的 AutoLoad 属性的值,也许是UICONTEXT_NoSolution

于 2012-05-07T20:11:26.053 回答
0

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

我相信这是因为您可以在进行事件订阅之前对您的 DTE 对象进行装箱和拆箱。这是一个巨大的麻烦,并且非常令人惊讶的是,DTE 对象不能轻松地通过服务位置传递以进行事件订阅;但这似乎是罪魁祸首。

我曾尝试保留对 DTE 对象的引用,但无论如何我都在这样做,但这并没有什么区别。有些事件会起作用,有些则不会;但这是一致的。

于 2013-01-06T07:50:36.903 回答