2012-01-08 62 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對象的引用,但無論如何我沒有做出任何改變。有些事件會起作用,有些則不會;但這是一致的。