2012-01-08 5 views
2

パッケージコンストラクタで、OnStartupCompleteイベントのイベントハンドラを追加しました。しかし、コードを実行すると、イベントハンドラは呼び出されません。私は間違って何をしていますか?DTEEvents.OnStartupCompleteイベントがVSPackage(VSSDK2010)で動作しない

+0

パッケージはデフォルトで読み込まれます。 Visual Studioに起動時にパッケージを読み込むように指示していますか?この質問に対する答えを見てください:http://stackoverflow.com/questions/7815461/vsix-execute-code-on-vs-startup – Will

+0

私はPackageAutoload属性を使用しましたが、この属性はVSがプロジェクトまたはソリューションファイル。 StartPageを開くためにVSのみを開くと、パッケージはロードされません!! – dattebayo

+0

私はそれが本当であるとは思わない。あなたのパッケージに置くことができる他の属性があります。これは、パッケージにソリューションが存在するときだけロードされるべきであることをVSに伝えます。あなたはそれらのうちの1つを使っていないと確信していますか? – Will

答えて

0

コードをパッケージコンストラクターからパッケージのInitialize()メソッドに移動してみてください。それは助けなければなりませんが、もしそうでなければ、他のUICONTEXT _をテストしますか???? AutoLoad属性の値は、おそらくUICONTEXT_NoSolutionですか?

3

明示的な参照がない限り、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

0

は、ここに私の答えを参照してください:http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/eb1e8fd1-32ad-498c-98e9-25ee3da71004

私はあなたがイベントサブスクリプションを行う前に、あなたのDTEオブジェクトをボクシングとアンボクシングされる可能性があるため、それがあると信じています。これは非常に厄介なことであり、DTEオブジェクトはイベント購読の目的でサービスロケーションを簡単に通過することができません。しかし、これが原因と思われる。

私はDTEオブジェクトへの参照を保持しようとしましたが、とにかくそれをやっていたのと同じように違いはありませんでした。いくつかのイベントは機能し、いくつかのイベントは機能しません。これは一貫しています。

関連する問題